Ffmpeg kullanarak bir videoya yeni bir ses (miksajsız) nasıl eklenir?


132

Şöyle bir komut kullandım:

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

videoya yeni ses parçası eklemek için en son sürümde (mix değil).

Ama ffmpeg'i en yeni sürüme güncelledim ( ffmpeg version git-2012-06-16-809d71d ) ve şimdi bu sürümde parametre -newaudioçalışmıyor.

Lütfen videoma (mix değil) kullanarak nasıl yeni ses ekleyebileceğimi söyleyin ffmpeg.


@Kiquenet Evet, haklısın. Ve cevap zaten verildi. Sadece bu konuyu okuyun. Bu soru 5 yaşında.
Vetalll

Yeni ses ekleyerek sesi değiştirmeyi kastediyorsunuz, değil mi? Bunu açıklığa kavuşturmak için sorunuzu düzenleyebilirim.
tommy.carstensen

Yanıtlar:


295

Videoya ses ekleyin: akış kopyası

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • -mapSeçeneğin atlanması, varsayılan akış seçimini kullanacaktır . Video girişinizde ses yoksa bu çalışacaktır.
  • Bu örnek kullanım alanları -codec copyiçin akış kopyası (yeniden kodlama, kalite korunur ve daha hızlı).
  • -shortestSeçenek yapacak output.avien kısa girdi olarak aynı süreye.

Videoya ses ekleyin: yeniden kodlayın

Çıktınız orijinal biçimleri beğenmiyorsa veya biçimleri değiştirmek istiyorsanız kodlayıcıları belirtebilirsiniz:

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

Belirli akışları manuel olarak seçmek için

Bazen varsayılan akış seçimi size istediğiniz sonucu vermez. Bu örnekte video.mp4video ve ses var ve audio.m4ayalnızca ses var. -mapAşağıdakilerden video video.mp4ve ses seçmek için kullanın audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- Girişten 0(ilk giriş, yani video.mp4) video akışlarını seçin .
  • -map 1:a- Girişten ( 1ikinci giriş audio.m4a) audio akışlarını seçin .

İki ses girişini tek cihazda karıştırmak / birleştirmek

Şuradan video alın video.webmve Amerika filtresini kullanarak video.webmve aşağıdakilerden gelen sesi birleştirin 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

Sessiz ses üretin

Sessiz bir ses akışı yapmak için anullsrc filtresini kullanabilirsiniz . Filtre, istenen kanal düzenini (mono, stereo, 5.1, vb.) Ve örnekleme oranını seçmenize olanak tanır.

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

Ayrıca bakın


5
Bu ilk başta benim için işe yaramadı, ancak benim için hile yapmak -map 0:0 -map 1:0yerine kullanmak -map 0 -map 1. Teşekkürler!
yonix

Bu, başlangıca boş bir çerçeve ekler.
Lenar Hoyt

bu komutu denedim, ancak video sesini kaybettim. video formatım mp4
Allan

@ Allan.Chan Orijinal soru video girişinden gelen sesi istemiyordu, ancak başka bir örnek ekledim: Başka bir ses girişini karıştırma / birleştirme örneğine bakın.
llogan

-shortestSeçeneği olmayan ilk çözüm benim için daha iyi çalıştı.
mmj

24

wav mp3 müzik

ffmpeg -i music.mp3 music.wav

videoya sığacak şekilde kısalt

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

müzik ve videoyu karıştır

ffmpeg -i musicshort.wav -i movie.avi final_video.avi

3
hatırladığım gibi, son değişken eski sesi yenisiyle değiştirecek.
Vetalll

Yeni sesi eski sesle birleştirme seçeneği var mı?
Iqbal Malik

1
@jwilson Bu komutu denedim, ancak video sesini kaybettim. video formatım mp4
Allan

Kaybetmemek için @Allan çözümü?
Kiquenet

20

Giriş videosunda birden fazla ses parçası varsa ve bir tane daha eklemeniz gerekiyorsa, aşağıdaki komutu kullanın:

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

-map 0ilk giriş dosyasından () tüm akışları kopyalamak (dahil etmek) ve ikinci giriş dosyasından ( input_video_with_audio.avi) -map 1tüm akışları (bu durumda bir) dahil etmek anlamına gelir new_audio.ac3.


Bence bu cevap en iyi cevap olmalı.
Nabi KAZ

4

Bu çözümlerin hiçbiri benim için pek işe yaramadı. Orijinal sesimin üzerine yazılıyordu veya daha karmaşık "amerge" örneğiyle "bellek eşlenemedi" gibi bir hata alıyordum. -Filter_complex amix'e ihtiyacım var gibi görünüyor.

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

Hiçbir şey benim için pek işe yaramadı (sanırım bunun nedeni girdi .mp4 videomda hiç ses olmamasıydı) bu yüzden bunun benim için çalıştığını buldum:

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


0

FFMPEG'in eski bir sürümünü kullanıyorsanız ve yükseltme yapamıyorsanız, aşağıdakileri yapabilirsiniz:

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

-Vcodec kullandığıma dikkat edin


0

Ffmpeg kullanarak videoya ses eklemek için kod.

Ses uzunluğu video uzunluğundan büyükse, sesi video uzunluğuna kadar keser. Videoda tam ses istiyorsanız cmd'den -kısa kaldırın.

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());
            }


        }

Nedir Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.