Bagaimana cara menambahkan audio baru (bukan pencampuran) ke dalam video menggunakan ffmpeg?


131

Saya menggunakan perintah seperti:

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

dalam versi terbaru untuk menambahkan trek audio baru ke video (bukan campuran).

Tapi saya memperbarui ffmpeg ke versi terbaru ( ffmpeg versi git-2012-06-16-809d71d ) dan sekarang dalam versi ini parameternya -newaudiotidak berfungsi.

Tolong beri tahu saya bagaimana saya bisa menambahkan audio baru ke video saya (bukan campuran) menggunakan ffmpeg.


@ Kiquenet Ya, Anda benar. Dan jawaban sudah diberikan. Baca saja utas ini. Pertanyaan ini berumur 5 tahun.
Vetalll

Dengan menambahkan audio baru maksud Anda mengganti audio, kan? Saya mungkin mengedit pertanyaan Anda untuk memperjelasnya.
tommy.carstensen

Jawaban:


295

Tambahkan audio ke video: stream copy

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Menghilangkan -mapopsi akan menggunakan pemilihan aliran default . Ini akan berfungsi jika input video Anda tidak memiliki audio.
  • Contoh ini digunakan -codec copyuntuk melakukan streaming salinan (tidak ada penyandian ulang; kualitas dipertahankan dan cepat).
  • The -shortestpilihan akan membuat output.avidurasi yang sama sebagai masukan terpendek.

Tambahkan audio ke video: penyandian ulang

Jika output Anda tidak menyukai format asli, atau jika Anda ingin mengubah format, Anda dapat menentukan encoders:

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

Untuk secara manual memilih aliran tertentu

Terkadang pemilihan aliran default tidak akan memberikan hasil yang Anda inginkan. Dalam contoh ini video.mp4memiliki video dan audio, dan audio.m4ahanya memiliki audio. Gunakan -mapuntuk memilih video dari video.mp4dan audio dari audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- Dari input 0( input pertama, yaitu video.mp4) pilih valiran ideo.
  • -map 1:a- Dari input 1( input kedua, yaitu audio.m4a) pilih audio stream.

Mencampur / menggabungkan dua input audio menjadi satu

Ambil video dari video.webm, dan gunakan filter amerge untuk menggabungkan audio dari video.webmdan 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

Hasilkan audio diam

Anda dapat menggunakan filter anullsrc untuk membuat aliran audio diam. Filter memungkinkan Anda memilih tata letak saluran yang diinginkan (mono, stereo, 5.1, dll) dan laju sampel.

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

Lihat juga


5
Ini tidak bekerja untuk saya pada awalnya, tetapi menggunakan -map 0:0 -map 1:0bukan -map 0 -map 1melakukan trik untuk saya. Terima kasih!
yonix

Ini memasukkan bingkai kosong di awal.
Lenar Hoyt

saya sudah mencoba perintah ini, tetapi saya kehilangan audio video. format video saya adalah mp4
Allan

@ Allan.Chan Pertanyaan awal tidak ingin audio dari input video, tapi saya menambahkan contoh lain: lihat Mencampur / menggabungkan contoh input audio lain .
llogan

Solusi pertama tanpa -shortestopsi bekerja lebih baik untuk saya.
mmj

24

mp3 musik ke wav

ffmpeg -i music.mp3 music.wav

terpotong agar sesuai dengan video

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

mencampur musik dan video

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

3
seingat saya, varian terakhir akan mengganti audio lama dengan yang baru.
Vetalll

Apakah ada opsi untuk menggabungkan audio baru dengan audio lama?
Iqbal Malik

1
@ jwilson saya sudah mencoba perintah ini, tetapi saya kehilangan audio video. format video saya adalah mp4
Allan

@ Semua solusi untuk tidak kehilangan?
Kiquenet

20

Jika video input memiliki beberapa trek audio dan Anda perlu menambahkan satu lagi, gunakan perintah berikut:

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

-map 0berarti menyalin (termasuk) semua stream dari file input pertama ( input_video_with_audio.avi) dan -map 1berarti untuk memasukkan semua stream (dalam hal ini satu) dari file input kedua ( new_audio.ac3).


Saya pikir, jawaban ini pasti jawaban terbaik.
Nabi KAZ

3

Tak satu pun dari solusi ini cukup berhasil untuk saya. Audio asli saya sedang ditimpa, atau saya mendapatkan kesalahan seperti "gagal memetakan memori" dengan contoh 'amerge' yang lebih kompleks. Sepertinya saya perlu -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

Tidak ada yang berhasil bagi saya (saya pikir itu karena input .mp4 video saya tidak memiliki audio) jadi saya menemukan ini bekerja untuk saya:

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


0

Jika Anda menggunakan FFMPEG versi lama dan Anda tidak dapat memutakhirkannya, Anda dapat melakukan hal berikut:

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

Perhatikan bahwa saya menggunakan -vcodec


0

Kode untuk menambahkan audio ke video menggunakan ffmpeg.

Jika panjang audio lebih besar dari panjang video, itu akan memotong audio ke panjang video. Jika Anda ingin audio lengkap dalam video hapus -pendek dari 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());
            }


        }

Apa Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.