TL; DR संस्करण:
यह उदाहरण केवल वीडियो प्रदर्शन करता है, यह मानते हुए कि दोनों वीडियो क्लिप एक ही रिज़ॉल्यूशन, फ़्रेम दर आदि हैं। यह फ़ेडआउट और फ़ेडिनक्लिप के बीच 1 सेकंड का फ़ेड बनाएगा। मान लें कि फ़ेडआउट ग्रहण 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
फ़िल्टर के उपयोग की निराशाजनक जटिलता से बचें
- सुनिश्चित करें कि समाधान यथासंभव सामान्य है (पुन: प्रयोज्य कोड)
- आवश्यक के रूप में क्रॉसफ़ेड अनुभाग को प्री-प्रोसेस और पोस्ट-प्रोसेस करने की अनुमति दें (यहाँ नहीं किया गया)
इन चार खंडों में से प्रत्येक निर्दिष्ट करता है: प्रारंभ समय (सेकंड), अंत समय (सेकंड), और रहस्यमय setpts=PTS-STARTPTS
फ़िल्टर , जो अनिवार्य रूप से प्रत्येक वीडियो को 0 सेकंड में प्रारंभ करता है। यह महत्वपूर्ण होगा जब उन्हें फिर से कंपोज़ किया जाएगा।
ध्यान दें कि s=0
विनिर्देशक निरर्थक हैं, और लोगों के setpts
लिए फ़िल्टर s=0
भी निरर्थक है। हालांकि, दोनों को फिल्टर परिसर को तोड़ने के बिना, प्रारंभ समय को 0 से बदलने की अनुमति देने के लिए अनावश्यक रूप से निर्दिष्ट किया गया है। इसके अलावा, दूसरी सामग्री क्लिप अंत तक चलती है, इसलिए e=
भाग (अंत =) निर्दिष्ट नहीं है।
[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
दोनों फीका वर्गों में एक अल्फा (पारदर्शिता) चैनल जोड़ते हैं । आप वास्तव में किसी भी प्रारूप का उपयोग कर सकते हैं जो एक अल्फा चैनल प्रदान करता है।
इस फ़िल्टर उपसमुच्चय में अगला हम एक को फीका करने के लिए निर्दिष्ट करते हैं, और एक को फीका करने के लिए। इसका 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];
यह क्या है ? : fifo
फिल्टर सुनिश्चित करता है कि फिल्टर परिसर में बफर स्पेस उपलब्ध है। आश्चर्यजनक रूप से, यह डिफ़ॉल्ट नहीं है। यदि आप ऐसा नहीं करते हैं, तो क्रॉसफेड विफल हो सकता है यदि ऊपर के चरण का आउटपुट ओवरले फ़िल्टर को ओवररन करता है। हाँ, मुझे पता है कि तुम अभी क्या सोच रहे हो। यह वास्तव में एक FFMPEG बग है ।
[fadein]fifo[fadeinfifo];
[fadeout]fifo[fadeoutfifo];
अब, दो फीका वर्गों को ओवरले करें: यह सुनिश्चित करके कि दो क्रॉसफ़ेड अनुभाग एक ही आकार के हैं, हमें ओवरले फ़िल्टर लेने के बजाय अधिक गंदा विकल्पों के बारे में चिंता करने की ज़रूरत नहीं है(और इसलिए हम उन्हें यहाँ अनदेखा करते हैं):
[fadeoutfifo][fadeinfifo]overlay[crossfade];
अंत में, हम अपने तीन सेगमेंट को कॉन्सेट फिल्टर का उपयोग करके लाइन अप करते हैं ।
[firstclip][crossfade][secondclip]concat=n=3[output]
और अब, आउटपुट पैड को अपने वीडियो स्रोत के रूप में मैप करें।
क्रॉस- yuv420p
सेक्शन को yuv420
आउटपुट चैनल पर सेट कर दिया जाएगा क्योंकि आप आमतौर पर (आमतौर पर ) का उपयोग करने के लिए पिक्सेल प्रारूप को सेट करने के लिए नहीं भूल जाते हैं ! (जैसा कि हमने इसे निर्दिष्ट नहीं किया, आप ओवरले के तर्कों का उपयोग कर सकते हैं) , यदि आप चाहते हैं yuv420
, तो आप ठीक हैं :-)
-map "[output]" <add your normal encoding part here>
आप बाद में (इस प्रश्नोत्तर के दायरे के बाहर) ऑडियो को पुनः प्राप्त कर सकते हैं