Как добавить новый звук (без микширования) в видео с помощью ffmpeg?

132

Я использовал команду как:

ffmpeg -i video.avi -i audio.mp3 -vcodec codec -acodec codec output_video.avi -newaudio

в последней версии для добавления новой звуковой дорожки в видео (не микс).

Но я обновил ffmpeg до последней версии ( ffmpeg version git-2012-06-16-809d71d ) и теперь в этой версии параметр -newaudioне работает.

Скажите, пожалуйста, как я могу добавить новое аудио в мое видео (не микс), используя ffmpeg.

Vetalll
источник
@Kiquenet Да, вы правы. И ответ уже дан. Просто прочитайте эту ветку. Этому вопросу 5 лет.
Vetalll
Под добавлением нового аудио вы подразумеваете замену аудио, верно? Я мог бы отредактировать ваш вопрос, чтобы прояснить это.
tommy.carstensen

Ответы:

295

Добавить аудио к видео: потоковая копия

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Отказ от -mapопции будет использовать выбор потока по умолчанию . Это будет работать, если на вашем видеовходе нет звука.
  • Этот пример использует -codec copyдля потокового копирования (без перекодирования; качество сохраняется, и это быстро).
  • -shortestВариант будет делать output.aviту же длительность, самый короткий вход.

Добавить аудио к видео: перекодировать

Если вашему выводу не нравятся исходные форматы или вы хотите изменить форматы, вы можете указать кодировщики:

ffmpeg -i video.avi -i audio.mp3 -c:v libx264 -c:a libvorbis -shortest output.mkv

Чтобы вручную выбрать конкретные потоки

Иногда выбор потока по умолчанию не даст желаемого результата. В этом примере video.mp4есть видео и аудио, и audio.m4aтолько аудио. Используйте -mapдля выбора видео video.mp4и аудио из audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- На входе 0(первый вход, который есть video.mp4) выберите video stream (s).
  • -map 1:a- Из ввода 1(второй вход, который является audio.m4a) выберите aпоток (ы) udio.

Микширование / объединение двух аудиовходов в один

Возьмите видео с video.webmи используйте фильтр слияния для объединения аудио с video.webmи audio.oga:

ffmpeg -i video.webm -i audio.oga -filter_complex \
"[0:a][1:a]amerge=inputs=2[a]" \
-map 0:v -map "[a]" -c:v copy -c:a libvorbis -ac 2 -shortest out.webm

Создать тихий звук

Вы можете использовать фильтр anullsrc для создания тихого аудиопотока. Фильтр позволяет выбрать желаемое расположение каналов (моно, стерео, 5.1 и т. Д.) И частоту дискретизации.

ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \
-c:v copy -shortest output.mp4

Также см

llogan
источник
5
Сначала это не сработало для меня, но использование -map 0:0 -map 1:0вместо -map 0 -map 1помогло мне. Спасибо!
yonix 07
Это вставляет пустой фрейм в начало.
Ленар Хойт,
Я пробовал эту команду, но теряю видео-звук. мой формат видео - mp4
Аллан
@ Allan.Chan Исходный вопрос не требовал звука с видеовхода, но я добавил еще один пример: см. Пример « Смешивание / комбинирование другого аудиовхода» .
llogan
Первое решение без -shortestопции сработало для меня лучше.
mmj
24

mp3 музыку в wav

ffmpeg -i music.mp3 music.wav

обрезать по размеру видео

ffmpeg -i music.wav -ss 0 -t 37 musicshort.wav

микшировать музыку и видео

ffmpeg -i musicshort.wav -i movie.avi final_video.avi
jwilson
источник
3
насколько я помню, последний вариант заменит старый звук на новый.
Vetalll
Есть ли возможность объединить новый звук со старым звуком?
Икбал Малик
1
@jwilson Я пробовал эту команду, но теряю видео-звук. мой формат видео - mp4
Аллан,
@Allan решение не проиграть?
Kiquenet
20

Если во входном видео есть несколько звуковых дорожек и вам нужно добавить еще одну, используйте следующую команду:

ffmpeg -i input_video_with_audio.avi -i new_audio.ac3 -map 0 -map 1 -codec copy output_video.avi

-map 0означает копирование (включение) всех потоков из первого входного файла ( input_video_with_audio.avi) и -map 1означает включение всех потоков (в данном случае одного) из второго входного файла ( new_audio.ac3).

user2513149
источник
Думаю, этот ответ должен быть лучшим.
Nabi KAZ
3

Ни одно из этих решений не помогло мне. Мой исходный звук перезаписывался, или я получал ошибку типа «не удалось отобразить память» в более сложном примере «amerge». Кажется, мне понадобился -filter_complex amix.

ffmpeg -i videowithaudioyouwanttokeep.mp4 -i audiotooverlay.mp3 -vcodec copy -filter_complex amix -map 0:v -map 0:a -map 1:a -shortest -b:a 144k out.mkv
пройдоха
источник
1

У меня ничего не получалось (я думаю, это из-за того, что в моем входном видео .mp4 не было звука), поэтому я обнаружил, что это сработало для меня:

ffmpeg -i input_video.mp4 -i balipraiavid.wav -map 0:v:0 -map 1:a:0 output.mp4

Александр Доре
источник
0

Если вы используете старую версию FFMPEG и не можете обновить ее, вы можете сделать следующее:

ffmpeg -i PATH/VIDEO_FILE_NAME.mp4 -i PATH/AUDIO_FILE_NAME.mp3 -vcodec copy -shortest DESTINATION_PATH/NEW_VIDEO_FILE_NAME.mp4

Обратите внимание, что я использовал -vcodec

Waqleh
источник
0

Код для добавления звука к видео с помощью ffmpeg.

Если длина аудио больше, чем длина видео, звук будет обрезан до длины видео. Если вам нужен полный звук в видео, удалите -shortest из cmd.

String[] cmd = new String[]{"-i", selectedVideoPath,"-i",audiopath,"-map","1:a","-map","0:v","-codec","copy", ,outputFile.getPath()};

private void execFFmpegBinaryShortest(final String[] command) {



            final File outputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");




            String[] cmd = new String[]{"-i", selectedVideoPath,"-i",audiopath,"-map","1:a","-map","0:v","-codec","copy","-shortest",outputFile.getPath()};


            try {

                ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
                    @Override
                    public void onFailure(String s) {
                        System.out.println("on failure----"+s);
                    }

                    @Override
                    public void onSuccess(String s) {
                        System.out.println("on success-----"+s);
                    }

                    @Override
                    public void onProgress(String s) {
                        //Log.d(TAG, "Started command : ffmpeg "+command);
                        System.out.println("Started---"+s);

                    }

                    @Override
                    public void onStart() {


                        //Log.d(TAG, "Started command : ffmpeg " + command);
                        System.out.println("Start----");

                    }

                    @Override
                    public void onFinish() {
                        System.out.println("Finish-----");


                    }
                });
            } catch (FFmpegCommandAlreadyRunningException e) {
                // do nothing for now
                System.out.println("exceptio :::"+e.getMessage());
            }


        }
Палач
источник
Что такое Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet