FFmpeg के साथ वीडियो क्रॉसफ़ेड करने का एक प्रभावी तरीका क्या है?


11

वीडियो सामग्री के दो टुकड़ों के बीच एक क्रॉसफेड ​​करना वास्तव में FFmpeg में काफी जटिल है। ऑडियो के लिए कोई "क्रॉसफ़ेड" फ़िल्टर नहीं है।

इसे करने का एक कारगर तरीका क्या है?


अच्छा स्वप्रमाणित प्रश्न!
जेकेगॉल्ड 1

इस उत्तर को बहुत अधिक उत्थान प्राप्त करने की आवश्यकता है ... मार्क, मैं आपको हमेशा के लिए प्यार करूंगा यदि आपने ऑडियो के लिए क्रॉस-फ़ेडिंग को भी जोड़ा ...
Merc

जैसे ही मुझे पता चलेगा, मैं इसे कैसे जोड़ूंगा। मुझे लगता है कि ऑडियो क्रॉसफेड ​​स्नैप, थियो 'है, विश्वास है कि इसके लिए एक साधारण फिल्टर है।
मार्क जेरोलिमेटोस

मैंने बस [0:a][1:a] acrossfade=d=1 [audio]फिल्टर में और फिर -map "[audio]" कमांड में जोड़ा और यह काम कर गया। यदि आप चाहें, तो इसे एक परीक्षण दें और उत्तर को अपडेट करें!
Merc

जवाबों:


17

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>

आप बाद में (इस प्रश्नोत्तर के दायरे के बाहर) ऑडियो को पुनः प्राप्त कर सकते हैं


1
नवीनतम ffmpeg में, इसे trim=start=0:end=9(बल्कि trim=st=0:e=9,..
Merc

लेकिन गंभीरता से, यह FFMPEG मैंने कभी देखा है पर सबसे अच्छा जवाब होना चाहिए, और सबसे स्पष्ट ffmpeg स्पष्टीकरण।
Merc

यार, कि मेरे सिर पर जा रहा है :-) सहारा के लिए धन्यवाद !!!!
मार्क गेरोलिमेटोस

कोई चिंता नहीं। कृपया उत्तर को विशेष रूप से = ट्रिम = स्टार्ट = 0 से अपडेट करें क्योंकि अभी यह नवीनतम ffmpeg के साथ काम नहीं करता है
Merc

नवीनतम ffmpeg संस्करण मुझे यह त्रुटि देता है: Filter setpts has an unconnected outputस्क्रिप्ट के लिए। मैंने ट्रिम मापदंडों को पहले ही शुरू और समाप्त करने के लिए बदल दिया।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.