จะเพิ่มเสียงใหม่ (ไม่ผสม) ลงในวิดีโอโดยใช้ ffmpeg ได้อย่างไร


132

ฉันใช้คำสั่งเช่น:

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สตรีม ideo
  • -map 1:a- จากอินพุต1( อินพุตที่สองซึ่งก็คือaudio.m4a) เลือกaสตรีม udio

การผสม / รวมอินพุตเสียงสองช่องเข้าเป็นหนึ่งเดียว

ถ่ายวิดีโอ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เคล็ดลับสำหรับฉัน ขอบคุณ!
yonix

สิ่งนี้แทรกกรอบว่างที่จุดเริ่มต้น
Lenar Hoyt

ฉันลองใช้คำสั่งนี้แล้ว แต่ฉันทำเสียงวิดีโอหาย รูปแบบวิดีโอของฉันคือ mp4
Allan

@ Allan.Chan คำถามเดิมไม่ต้องการเสียงจากช่องสัญญาณวิดีโอ แต่ฉันเพิ่มอีกตัวอย่างหนึ่ง: ดูผสม / รวมอินพุตเสียงอื่นตัวอย่างเช่น
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
อย่างที่ฉันจำได้ตัวแปรสุดท้ายจะแทนที่เสียงเก่าด้วยเสียงใหม่
Vetalll

มีตัวเลือกใดในการรวมเสียงใหม่กับเสียงเก่าหรือไม่?
Iqbal Malik

1
@jwilson ฉันลองใช้คำสั่งนี้แล้ว แต่ฉันทำเสียงวิดีโอหาย รูปแบบวิดีโอของฉันคือ mp4
Allan

@ อัลลันแก้ไม่หาย?
Kiquenet

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)


ฉันคิดว่าคำตอบนี้ต้องเป็นคำตอบที่ดีที่สุด
Nabi KAZ

4

วิธีแก้ปัญหาเหล่านี้ไม่ได้ผลสำหรับฉันเลย เสียงต้นฉบับของฉันถูกเขียนทับหรือฉันได้รับข้อผิดพลาดเช่น "ล้มเหลวในการแมปหน่วยความจำ" ด้วยตัวอย่าง "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");?
Kiquenet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.