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

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

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.

Ответ 1

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

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

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

Возьмите видео с video.webm и используйте фильтр amerge, чтобы объединить звук с 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

Также см.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Код для добавления звука в видео с помощью 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());
            }


        }