Як додати нове аудіо (не змішування) у відео за допомогою ffmpeg?


131

Я використовував таку команду, як:

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

в останній версії для додавання нової аудіодоріжки до відео (не суміш).

Але я оновив ffmpeg до новітньої версії ( ffmpeg версія git-2012-06-16-809d71d ), і тепер у цій версії параметр -newaudioне працює.

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


@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) виберіть vпотоки (ідео).
  • -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

Також див


5
Спочатку це не спрацювало для мене, але використання -map 0:0 -map 1:0замість цього -map 0 -map 1зробило для мене трюк. Дякую!
йонікс

Це вставляє порожній кадр на початку.
Ленар Хойт

Я спробував цю команду, але я втрачаю відео-аудіо. мій формат відео - mp4
Аллан

@ Allan.Chan оригінальний питання не хоче звуку з відеовходу, але я додав ще один приклад: см Mixing / комбінуючи інший аудиовход приклад.
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

3
Як я пам’ятаю, останній варіант замінить старе аудіо на нове.
Веталл

Чи є можливість об'єднати нове аудіо зі старим звуком?
Ікбал Малик

1
@jwilson Я спробував цю команду, але я втрачаю відео-аудіо. мій формат відео - mp4
Аллан

@Allan рішення не втратити?
Кікенет

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


Я думаю, ця відповідь повинна бути найкращою відповіддю.
Набі КАЗ

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


0

Код для додавання аудіо до відео за допомогою 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());
            }


        }

Що таке Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Кікенет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.