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>
จากนั้นคุณสามารถรวมเสียงอีกครั้งในภายหลัง (นอกขอบเขตของคำถาม & คำตอบนี้)