crossfade ระหว่าง 2 วิดีโอโดยใช้ ffmpeg


27

ฉันพยายามที่จะให้เกิดการเปลี่ยนแปลง crossfade ระหว่าง 2 คลิปวิดีโอโดยใช้ ffmpeg แต่มันล้มเหลวไปแล้ว ฉันใหม่กับ ffmpeg และส่วนใหญ่พึ่งพาการปรับแต่งสิ่งที่ฉันสามารถหาได้ในเอกสารประกอบและตัวอย่างที่มีอยู่ออนไลน์ จากสิ่งที่ฉันอ่านจนถึงตอนนี้การใช้ตัวกรองผสมผสานหรือซ้อนทับควรช่วยในการบรรลุสิ่งที่ฉันตามมา แต่ฉันไม่สามารถหารายละเอียดบรรทัดคำสั่งเพื่อให้มันทำงานได้

จางและ concat ฟิลเตอร์ที่ดีสำหรับการจางหายออกจากวิดีโอ 1, จางในวิดีโอที่ 2 และ concat 2 แบ่งออกเป็น 1 คลิปการเปลี่ยนประเภท แต่ฉันขอขอบคุณที่ช่วยในการคำสั่งเพื่อการเปลี่ยนแปลงจากวิดีโอ 1 ถึง 2 วิดีโอโดยไม่ต้องมีจะเป็นสีดำในระหว่าง ฉันไม่สามารถหาตัวอย่างใด ๆ สำหรับปัญหานี้ได้ทุกที่บางทีฉันกำลังมองหาคำหลักที่ผิด ...

ยิ่งไปกว่านั้นวิดีโอของฉันคือ mp4 (วิดีโอ h264 ไม่มีเสียงในกรณีที่สำคัญ) แต่ละตัวมีความยาว 5 วินาทีและฉันเปลี่ยนจากประมาณ วิดีโอ 4.5 4.5 วิดีโอ 0.5 ถึง 2

คล้ายกับสิ่งที่กวดวิชานี้ใช้ MLT และเฟรม (ดู 2:25 สำหรับตัวอย่างจาง) แม้ว่าฉันกำลังมองหาวิธีการทำเช่นนี้เพียงแค่ใน ffmpeg โดยไม่ต้องเรียกโปรแกรมอื่น ๆ http://www.youtube.com/watch?v=3PRZ9L_KLdI

พอยน์เตอร์หรือบรรทัดคำสั่งใด ๆ ที่จะจางหายไปเช่นนี้จะได้รับการชื่นชมมากขอบคุณมาก!


คำตอบ:


23

ฉันแนะนำให้ทำเช่นนั้น:

  • สร้างพื้นหลังสีดำที่มีระยะเวลาและความละเอียดเท่ากันกับวิดีโอเอาต์พุต
  • เพิ่มช่องอัลฟ่าลงในแต่ละวิดีโอ
  • เพิ่มเฟดเดอร์เอฟเฟ็กต์ให้กับแต่ละวิดีโอ
  • ใช้การซ้อนทับในแต่ละวิดีโอที่มีพื้นหลังสีดำ

ดังนั้นคำสั่งสำหรับการเพิ่ม crossfade ไปที่ 2 วิดีโอ (5 วินาที) แต่ละอันควรจะเป็น:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

สิ่งนี้จะจางหายไปวิดีโอแรกถึงอัลฟาที่ 4 วินาที (st = 4) ในช่วง 1 วินาที (d = 1), จางหายไปในหนึ่งวินาทีที่ 0 วินาที (st = 0) ในช่วง 1 วินาที (d = 1) และย้ายมันแสดง ส่งต่อเวลาไปยัง 4 วินาที (+ 4 / TB) จากนั้นเราเพิ่งตัด 9 วินาทีของสีดำปรับขนาดเป็นขนาดวิดีโอออกและวางซ้อนสิ่งต่าง ๆ

หวังว่ามันจะช่วย


สวัสดี @ptQa ขอบคุณมากเอฟเฟกต์ crossfade ใช้งานได้อย่างมีเสน่ห์ แม้ว่าสิ่งที่เกิดขึ้นในวิดีโอออกก็คือมันจะแสดงเฉพาะส่วนบนซ้ายของวิดีโอต้นฉบับและส่วนที่เหลือของเฟรมหายไป ฉันดูที่ความละเอียดอินพุตเป็น 960 x 720 และเอาต์พุตเป็น 320 x 240 แต่ไม่ลดขนาดวิดีโอทั้งหมดแทนที่จะตัดส่วน 320 x 240 ที่ด้านซ้ายบนและแสดงว่าในวิดีโอเอาต์พุตส่วนที่เหลือของ วิดีโออินพุตหายไป มีการเพิ่มบรรทัดคำสั่งของคุณที่ป้องกันสิ่งนี้หรือไม่?
Mugba

โอ้ฉันเข้าใจแล้วคุณควรปรับขนาดสีดำเป็นความละเอียดที่คุณต้องการ ดูคำตอบที่อัปเดต ฉันได้เพิ่มมาตราส่วนเพื่อกรองกราฟ
ptQa

นั่นแก้ไขได้แล้วขอบคุณ ฉันอัปโหลดวิดีโอตัวอย่างที่แสดงการไขว้เขวในกรณีที่ทุกคนต้องการเห็นมันในการดำเนินการyoutu.be/JqorgXAjjTo
Mugba

ปัญหาเดียวกัน; ฉันมีรูปแบบการทำงานที่แตกต่างกันในวิดีโอของฉันเอง - ขอบคุณ คำถาม: สิ่งนี้จะได้รับการแก้ไขอย่างไรเพื่อข้ามแทร็กเสียงของวิดีโอให้เป็นไปตามรูปแบบเดียวกับวิดีโอที่จางหายไป?
Jim Miller

1
BTW ฉันคิดว่ามีข้อผิดพลาดในคำสั่งตัวอย่างของคำตอบ - มันควรจะ-i 1.mp4 -i 2.mp4...ใช่มั้ย
Jim Miller

7

นี่คือวิธีที่ฉันทำ:

  • ffmpeg รุ่น N-77197-gdf2ce13
  • 2 วิดีโอแต่ละ 4 วินาที
  • จำเป็นต้องเข้าร่วมกับจางระหว่างพวกเขา
  • วิดีโอมีขนาด 25 fps

1) เพิ่มจางหาย (แสงเป็นสีเข้ม) ในตอนท้ายของวันที่ 1 และจางหายไป (มืดไปสว่าง) ที่จุดเริ่มต้นของ 2:

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 หมายความว่าการจางหายจะเริ่มเฟรมที่ 76 และจะเสร็จสิ้น 24 เฟรมในภายหลัง = 1s หายไป

0:25 หมายความว่าการจางในจะเริ่มเฟรม 0 และจะเสร็จ 25 เฟรมในภายหลัง

2) รวมวิดีโอ 2 รายการ

แปลงทั้งหมดเป็น TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

ผสาน

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

ขอบคุณที่:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php


6
นี่ไม่ใช่ crossfade
Gyan

4
@Mulvya พูดอะไร crossfade จางหายไปหนึ่งคลิปในเวลาเดียวกันกับที่อื่นจะจางหายไปคลิปแรกมีความโปร่งใสเพิ่มขึ้นอย่างต่อเนื่องในช่วงระยะเวลาของ crossfade; ที่สองมีความโปร่งใสลดลงอย่างต่อเนื่อง
intuited

7

ffmpeg-concatเป็นวิธีที่ง่ายที่สุดในการบรรลุสิ่งที่คุณต้องการและช่วยให้คุณใช้ช่วงการเปลี่ยนภาพแบบเซ็กซี่ของ OpenGL จำนวนมากโดยค่าเริ่มต้นคือ crossfade

ffmpeg-gl-transitionเป็นตัวกรอง ffmpeg ที่กำหนดเองซึ่งช่วยให้คุณใช้ GLSL เพื่อการเปลี่ยนระหว่างสองวิดีโอสตรีมได้อย่างราบรื่น ตัวกรองนี้ใช้และกำหนดเองได้ง่ายกว่าตัวเลือกอื่น ๆ ที่ระบุไว้ที่นี่

ตัวกรองนี้รองรับรายการประเภทการเปลี่ยนแปลงขนาดใหญ่โดยค่าเริ่มต้นเป็น crossfade

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

4
คุณคิดว่าจะส่งแพตช์ไปที่ FFmpeg หรือไม่?
llogan

1
แน่นอนฉันจะต้องแก้ไขปัญหาเล็ก ๆ และทดสอบเพิ่มเติมก่อน โทรดี!
fisch2

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