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

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

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

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

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

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

6 ответов


добавить аудио в видео: stream copy

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • пропуск -map опция будет использовать значение по умолчанию выбор потока. Это будет работать, если ваш видеовход не имеет звука.
  • в этом примере используется -codec copy to трансляция копия (без повторного кодирования; качество сохраняется и быстро).
  • на сделает 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) выберите vидео поток(ов).
  • -map 1:a – от ввода 1 (второй вход, который составляет audio.m4a) выберите audio поток (ы).

смешивание / объединение двух аудиовходов в один

возьмите видео из 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

см. Также


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

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

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).


ни одно из этих решений работал для меня. Мой оригинальный звук был перезаписан, или я получал ошибку, как "не удалось сопоставить память" с более сложным примером "амерге". Кажется, мне нужен-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

Если вы используете старую версию 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


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

Если длина аудио является больше, чем длина видео будет вырезать аудио с видео. Если вы хотите, чтобы полный аудио в видео удалить-кратчайший из 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());
            }


        }