วิธีที่มีประสิทธิภาพในการทำวิดีโอ crossfade กับ FFmpeg คืออะไร?


11

การทำ crossfade ระหว่างเนื้อหาวิดีโอสองชิ้นนั้นค่อนข้างซับซ้อนใน FFmpeg ไม่มีตัวกรอง "crossfade" เหมือนกับเสียง

วิธีที่มีประสิทธิภาพในการทำคืออะไร?


คำถามที่ตอบเองดี
JakeGould

คำตอบนี้ตอบสนองความต้องการที่จะได้รับ upvotes มากขึ้น ... Mark ผมนั้นจะรักคุณตลอดไปถ้าคุณเพิ่มข้ามซีดจางสำหรับเสียงมากเกินไป ...
Merc

ทันทีที่ฉันรู้ว่าฉันจะเพิ่มมันยังไง ฉันคิดว่า crossfade เสียงเป็น snap, tho 'เชื่อว่ามีตัวกรองอย่างง่ายสำหรับมัน
Mark Gerolimatos

ฉันเพิ่งเพิ่ม[0:a][1:a] acrossfade=d=1 [audio]ไปที่ตัวกรองแล้ว-map "[audio]" ไปที่คำสั่งและใช้งานได้ ถ้าคุณชอบให้ทดสอบและอัปเดตคำตอบ!
Merc

คำตอบ:


17

TL; DR เวอร์ชัน:

ตัวอย่างนี้ใช้งานวิดีโอเท่านั้นโดยสมมติว่าคลิปวิดีโอทั้งสองนั้นมีความละเอียดเท่ากันอัตราเฟรมและอื่น ๆ ซึ่งจะสร้างการจางหายไป 1 วินาทีระหว่าง fadeoutclip และ fadeinclip สมมติว่า fadeoutclip มีความยาว 10 วินาที โปรดทราบว่าสิ่งนี้ได้รับการจัดรูปแบบเพื่อความชัดเจน: เป็นโค้ดหนึ่งบรรทัดจริงๆ

ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an \
-filter_complex "\
    [0:v]trim=start=0:end=9,setpts=PTS-STARTPTS[firstclip]; \
    [1:v]trim=start=1,setpts=PTS-STARTPTS[secondclip]; \
    [0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
    [1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
    [fadeinsrc]format=pix_fmts=yuva420p, \
                fade=t=in:st=0:d=1:alpha=1[fadein]; \
    [fadeoutsrc]format=pix_fmts=yuva420p, \
                fade=t=out:st=0:d=1:alpha=1[fadeout]; \
    [fadein]fifo[fadeinfifo]; \
    [fadeout]fifo[fadeoutfifo]; \
    [fadeoutfifo][fadeinfifo]overlay[crossfade]; \
    [firstclip][crossfade][secondclip]concat=n=3[output] \
    " \
-map "[output]" <add in encoding part here>

เวอร์ชันเต็ม:

นี่คือคำอธิบายเกี่ยวกับสิ่งที่เกิดขึ้นเกี่ยวกับ:

ข้อกำหนดการป้อนข้อมูล ... ชัดเจน

ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an

การสร้างfilter_complex: สมมติว่าคุณเข้าใจคอมเพล็กซ์ตัวกรองแล้ว:

-filter_complex

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

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

  • ปฏิบัติตามวิธีการตามปกติที่ใช้โดยเครื่องมือแก้ไขวิดีโอ GUI
  • หลีกเลี่ยงความซับซ้อนที่น่าผิดหวังของการoverlayใช้งานตัวกรอง
  • ตรวจสอบให้แน่ใจว่าการแก้ปัญหาเป็นเรื่องทั่วไปที่สุดเท่าที่จะทำได้ (เช่นรหัสที่ใช้ซ้ำได้)
  • อนุญาตให้เราประมวลผลล่วงหน้าและโพสต์ประมวลผลส่วน crossfade ตามความจำเป็น (ไม่ดำเนินการที่นี่)

แต่ละส่วนสี่เหล่านี้ระบุ:เวลาเริ่มต้น (วินาที) เวลาสิ้นสุด (วินาที) และsetpts=PTS-STARTPTSตัวกรองลึกลับซึ่งทำให้แต่ละคลิปวิดีโอเริ่มต้นที่ 0 วินาที สิ่งนี้จะมีความสำคัญเมื่อทำการประกอบใหม่

โปรดทราบว่าตัวs=0ระบุเป็นแบบซ้ำซ้อนและsetptsตัวกรองสำหรับตัวแบบs=0นั้นซ้ำซ้อน อย่างไรก็ตามทั้งสองจะถูกระบุซ้ำซ้อนเพื่อให้เวลาเริ่มต้นเปลี่ยนจาก 0 โดยไม่ทำลายตัวกรองที่ซับซ้อน นอกจากนี้คลิปเนื้อหาที่สองยังวิ่งไปจนถึงจุดสิ้นสุดดังนั้นe=ไม่ได้ระบุส่วน (end =)

    [0:v]trim=s=0:e=9,setpts=PTS-STARTPTS[firstclip];
    [1:v]trim=s=1,setpts=PTS-STARTPTS[secondclip];
    [0:v]trim=s=9:e=10,setpts=PTS-STARTPTS[fadeoutsrc];
    [1:v]trim=s=0:e=1,setpts=PTS-STARTPTS[fadeinsrc];

ต่อไปเราจะระบุจางและเลือนออก:ครั้งแรกที่เราได้เพิ่มอัลฟา (โปร่งใส) ช่องทางทั้งสองส่วนจางโดยการระบุรูปแบบพิกเซลของ yuva420pคุณสามารถใช้รูปแบบใดก็ได้ที่ให้ช่องอัลฟา

ถัดไปในตัวกรองนี้ subcomplex เราระบุหนึ่งที่จะหายไปและหนึ่งที่จะจางหายไปใน.alpha=1หมายความว่าวิดีโอที่ตัวเองจะไม่มืดเพียงจำนวนเงินที่โปร่งใสจะ "จาง" stหมายถึงเริ่มdหมายถึงระยะเวลา

    [fadeinsrc]format=pix_fmts=yuva420p,      
                fade=t=in:st=0:d=1:alpha=1[fadein];
    [fadeoutsrc]format=pix_fmts=yuva420p,
                fade=t=out:st=0:d=1:alpha=1[fadeout];

นี้คืออะไร ?: กรองเพื่อให้แน่ใจว่ามี buffer พื้นที่ว่างในตัวกรองที่ซับซ้อน น่าแปลกที่นี่ไม่ใช่ค่าเริ่มต้น หากคุณไม่ทำเช่นนี้ crossfade อาจล้มเหลวหากเอาต์พุตของสเตจด้านบนมีการโอเวอร์เลย์ตัวกรองโอเวอร์เลย์ด้านล่าง ใช่ฉันรู้ว่าคุณกำลังคิดอะไรอยู่ตอนนี้ มันย่อมเป็นข้อผิดพลาด FFMPEGfifo

    [fadein]fifo[fadeinfifo];
    [fadeout]fifo[fadeoutfifo];

ตอนนี้การซ้อนทับส่วนที่จางลงสองส่วน:โดยการทำให้แน่ใจว่าส่วน crossfade ทั้งสองมีขนาดเท่ากันเราไม่ต้องกังวลกับตัวเลือกที่น่ารังเกียจมากกว่าที่ตัวกรองการซ้อนทับใช้ (และเราเพิกเฉยต่อที่นี่)

    [fadeoutfifo][fadeinfifo]overlay[crossfade];

สุดท้ายเราแถวสามส่วนของเราใช้ตัวกรอง concat

    [firstclip][crossfade][secondclip]concat=n=3[output]

และตอนนี้แผนที่แผ่นออกเป็นแหล่งวิดีโอของคุณ

อย่าลืมตั้งค่ารูปแบบพิกเซลเป็นสิ่งที่คุณใช้เป็นประจำ (โดยทั่วไปyuv420p) เนื่องจากส่วน crossfade จะตั้งไว้yuv420ที่ช่องสัญญาณออก! (เนื่องจากเราไม่ได้ระบุไว้คุณสามารถใช้อาร์กิวเมนต์การซ้อนทับ)แน่นอนถ้าคุณต้องการyuv420คุณก็ไม่เป็นไร :-)

-map "[output]" <add your normal encoding part here>

จากนั้นคุณสามารถรวมเสียงอีกครั้งในภายหลัง (นอกขอบเขตของคำถาม & คำตอบนี้)


1
ใน ffmpeg ล่าสุดนั้นจำเป็นต้องมีtrim=start=0:end=9(แทนที่จะtrim=st=0:e=9,..
Merc

แต่อย่างจริงจังนี่จะต้องเป็นคำตอบที่ดีที่สุดสำหรับ FFMPEG ที่ฉันเคยเห็นและคำอธิบาย ffmpeg ที่ชัดเจนที่สุดเท่าที่เคยมีมา
Merc

ผู้ชายนั่นกำลังจะไปที่หัวของฉัน :-) ขอบคุณสำหรับอุปกรณ์ประกอบฉาก !!!!
Mark Gerolimatos

ไม่ต้องห่วง. โปรดอัปเดตคำตอบโดยเฉพาะอย่างยิ่งกับ = trim = start = 0 เหมือนตอนนี้มันไม่ทำงานกับ ffmpeg ล่าสุด
Merc

เวอร์ชัน ffmpeg ล่าสุดให้ข้อผิดพลาดนี้: Filter setpts has an unconnected outputสำหรับสคริปต์ ฉันได้เปลี่ยนพารามิเตอร์การตัดแต่งเพื่อเริ่มต้นและสิ้นสุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.