ffmpeg เพิ่มเสียง แต่ให้ความยาววิดีโอเหมือนกัน (ไม่ใช่ -shortest)


12

ฉันกำลังเพิ่มเสียงให้ไฟล์วิดีโอโดยใช้ ffmpeg อย่างนั้น

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

อย่างไรก็ตามสิ่งนี้จะขยายไฟล์วิดีโอออกให้เป็นความยาวของไฟล์เสียงหากมันยาวกว่าวิดีโอ การใช้ -shortest จะตัดไฟล์วิดีโอให้สั้นหากไฟล์เสียงสั้นกว่าวิดีโอ ดังนั้นจะมีการตั้งค่าสถานะเพื่อบอก ffmpeg ให้ตัดความยาวของวิดีโอออกไปตามความยาวของวิดีโออินพุตหรือไม่


โปรดเลือกคำตอบที่ถูกต้อง สิ่งที่ถูกต้องจริงเพียงอย่างเดียวคือโดย @Zurechtweiser
Roel Van de Paar

คำตอบ:


13

ฉันเชื่อว่าคุณสามารถบรรลุเป้าหมายที่คุณต้องการได้โดยใช้ตัวเลือก -filter_complex และตัวกรอง apad เพื่อแยกเสียงของคุณออกด้วยความเงียบในตอนท้ายหากวิดีโอยาวขึ้น คำสั่งของคุณจะเป็น:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

นี่ถือว่าเสียงที่คุณต้องการอยู่ในสตรีมแรกของ audiofile.wav ไวยากรณ์ [A: B] บอกว่าจะใช้สตรีม B'th จากอินพุต A'th (ทั้งเริ่มต้นด้วย 0 ดังนั้น [1: 0] คือ สตรีมที่ 1 จากอินพุตที่ 2 หรือ audiofile.wav ด้านบน)

รายละเอียดได้ที่: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68


คุณควรพูดถึงว่า-filter_complexตัวเลือกบังคับให้เข้ารหัสซ้ำ - มันเป็นไปได้เช่นที่จะทำงานffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4แต่ไม่ใช่ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck

นี่คือคำตอบที่ตรงข้ามกับสิ่งที่ขอ OP ขอให้จบวิดีโอเมื่อเสียงจบลงคำตอบที่ได้รับคือการเพิ่มความเงียบเสียงถ้าเสียงสั้นกว่าวิดีโอ คำตอบนี้ไม่ถูกต้อง
Roel Van de Paar

ไม่ใช่ "สิ่งที่ตรงกันข้าม" ของสิ่งที่ OP ร้องขอ OPs ต้องการให้วิดีโอเอาต์พุตเป็นความยาวของอินพุตวิดีโอโดยไม่คำนึงถึงความยาวของแทร็กเสียง คำตอบของฉันระบุสถานการณ์ที่วิดีโออินพุตยาวกว่าไฟล์เสียง OP มีวิธีแก้ปัญหาเมื่อวิดีโออินพุตสั้นกว่าไฟล์เสียงซึ่งจะใช้ -shortest
deadcode

12
  • หากความยาววิดีโอสั้นกว่าความยาวเสียง-shortestสิ่งที่คุณต้องการคือ
  • หากความยาววิดีโอยาวกว่าความยาวของเสียงจะไม่มีการตั้งค่าสถานะใด ๆ ตามที่คุณต้องการ

ไม่มีการตั้งค่าสถานะเพื่อทำการตัดสินใจนี้โดยอัตโนมัติ

แก้ไข

แรงบันดาลใจจากคำตอบของ @ deadcode ฉันต้องทำให้ชัดเจนว่า "ไม่มีการตั้งค่าสถานะเพื่อทำให้เป็นอัตโนมัติ" แน่นอนว่าไม่เป็นความจริงถ้าคุณยินดีที่จะเข้ารหัสใหม่ : ในกรณีนี้ไปด้วยapad@deadcode ตามที่แนะนำ

หากคุณต้องการหลีกเลี่ยงการเข้ารหัสซ้ำ (เช่น-c:v copy) คำตอบจะเป็นเช่นนั้น

มีวิธีแก้ปัญหาโดยใช้ffconcatdemuxer แต่ต้องการการทำงานเล็กน้อย:

  • สร้างไฟล์ที่มีความเงียบในรูปแบบเดียวกับไฟล์เสียงของคุณ ("silence.wav")
  • สร้างไฟล์ concat "audio.ffconcat" (มีสายเงียบมากเท่าที่คุณต้องการเพื่อให้แน่ใจว่าเสียงของคุณยาวพอ):

.

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • วิ่ง ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

สิ่งนี้จะสังเคราะห์apadตัวกรองโดยไม่มีกราฟตัวกรองดังนั้นจึงอนุญาตให้ mux โดยไม่ต้องเข้ารหัสใหม่


@RoelVandePaar อย่างที่ฉันบอก: หากความยาววิดีโอสั้นกว่าความยาวของเสียงใช้-shortestอีกวิธีหนึ่งใช้วิธีแก้ปัญหานี้หากคุณต้องการเพิ่มความเงียบโดยไม่ต้องเข้ารหัสใหม่
Eugen Rieck

ถูกต้องพลาดที่รีวิว ลบอินพุต อย่าลังเลที่จะทำเช่นเดียวกัน
Roel Van de Paar

6

หากคุณทราบความยาวของไฟล์วิดีโอคุณสามารถทำได้โดยใช้

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

โดยที่ 43 คือความยาวของไฟล์วิดีโอของคุณในไม่กี่วินาที


คำถามผู้แต่งต้องการวนลูปไฟล์เสียงในขณะที่วิดีโอยังไม่เสร็จ สิ่งนี้ใช้ได้ผลหรือไม่?
Rafael Sanches

@RafaelSanches ไม่เขาไม่ได้ทำ
Zurechtweiser

ผู้เขียนไม่ต้องการวนลูปเสียง คำตอบนี้เป็นคำตอบเดียวที่ถูกต้องซึ่งทำในสิ่งที่ OP ขอ จบวิดีโอเมื่อวิดีโออินพุตสิ้นสุด
Roel Van de Paar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.