FFmpeg का उपयोग करके हर सम या विषम फ्रेम को गिराएं?


14

क्या कच्चा वीडियो लेने और उसमें से एक नया वीडियो निकालने का एक सटीक तरीका है जिसमें केवल विषम फ़्रेम या यहां तक ​​कि फ़्रेम हैं (पसंद से)?

उदाहरण के लिए:

मेरे पास 400 फ्रेम (0-399) के साथ "blah.yuv" है। मैं "blahOdd.yuv" बनाना चाहता हूं जिसमें फ्रेम 1-399 (1,3,5,7 ... 399) और "blahEven" है जिसमें फ्रेम 0-398 (0,2,4,6 ... 398) शामिल हैं )।

किसी भी विचार यह कैसे करने के लिए केवल FFmpeg का उपयोग कर?

जवाबों:


11

सही तरीके से काम करने के लिए, पहले वीडियो को RAW YUV बिटस्ट्रीम में कनवर्ट करें (यदि यह पहले से नहीं है):

ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv

अगला चरण: selectफ़िल्टर एक अभिव्यक्ति लेता है , जहां nफ्रेम नंबर है।

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv

ffmpegफ़्रेम को डुप्लिकेट नहीं करने के लिए , आपको अपने इनपुट के फ्रामरेट के आधे हिस्से को मजबूर करना होगा - इसलिए आप आउटपुट के लिए "2" को इनपुट के रूप में और "1" सेट करें। WxH को अपनी क्लिप के वास्तविक आयामों के साथ बदलना न भूलें क्योंकि कच्चे बिटस्ट्रीम में हेडर नहीं होता है जो इस जानकारी को वहन करता है।

उपरोक्त के बजाय, setptsआउटपुट के लिए नए टाइमस्टैम्प सेट करने के लिए फ़िल्टर को जोड़ने की एक और संभावना होगी । लेकिन सावधान रहें क्योंकि यह फ्रेम को सही तरीके से नहीं गिराता है। यहां 25 वास्तविक आउटपुट फ्रेम दर है जो आप चाहते हैं:

ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv

आप निश्चित रूप से एक और पिक्सेल प्रारूप (कोई भी ffmpeg -pix_fmts) चुन सकते हैं । सुनिश्चित करें कि फ़ाइल पढ़ते समय आप पिक्सेल आकार और पिक्सेल प्रारूप जानते हैं:

ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …

धन्यवाद, FFMPEG के नए संस्करणों के लिए इसे -filter के बजाय -f: v होना चाहिए। इसके अलावा यह आधुनिक होना चाहिए (n-1 \, 2) क्योंकि n की गिनती 1 से शुरू होती है जबकि फ्रेम की गिनती 0 से होती है (अन्यथा पहला फ्रेम 3 बार डुप्लिकेट होता है)। लेकिन अभी भी एक समस्या है, यह फ्रेम को डुप्लिकेट करता है जबकि मैं उनसे छुटकारा पाना चाहता हूं - उदाहरण के लिए अंतिम क्लिप में केवल आधे फ्रेम होंगे।
मार्क

-vfका एक उपनाम है -filter:v। मैं अब इसका मज़बूती से परीक्षण नहीं कर सकता, लेकिन इस पर बाद में गौर करूंगा जब मैं अपनी मशीन पर वापस आऊंगा। शायद tinterlaceफिल्टर भी ऐसा कर सकता है?
slhck

मैंने '-r 2 -i blah.yuv -r 1' की कोशिश की है, लेकिन यह मुझे एक त्रुटि विकल्प
मार्क

आह खेद .. खरोंच, यह काम नहीं करता है (अब?) और केवल छवियों के लिए।
slhck

1
@AnmolSinghJaggi नहीं, यह सिर्फ फ़्रेम को गिराता है, लेकिन मुझे यकीन नहीं होगा कि यह इतना निर्धारक है (यानी, हर विषम फ्रेम को गिराता है)। यह समय कोड पर आधारित होगा, जो सटीक नहीं हो सकता है।
slhck

2

यदि आपका ffmpeg AviSynth ध्वज के साथ बनाया गया था, तो मेरा मानना ​​है कि आप एक .avsफाइल पास कर सकते हैं ।

आप कॉन्फ़िगरेशन डेटा में चल रहे हैं ffmpegऔर देख सकते हैं । --enable-avisynth--enable-AviSynth

यदि यह है कि आप ऐसा चाहते का उपयोग कर सकते हैं: ffmpeg -i blahEven.avs blahEven.yuv

कहाँ blahEven.avsबस है:

ffvideosource ( "blah.yuv")। SelectEven ()

विषम फ्रेम के लिए, का उपयोग करें SelectOdd()

अधिक उपयोग के लिए, SelectEvery प्रलेखन देखें ।


यह एक उत्कृष्ट विकल्प है, लेकिन जैसा कि मैंने उल्लेख किया है - मैं केवल ffmpeg का उपयोग करने के लिए सीमित हूं। इसका कारण यह है कि यह एक स्वचालित प्रणाली का एक हिस्सा है जो केवल .bat फाइलें बनाएगा, इसके अलावा AVS के लिए कोई संभावना नहीं है।
मार्क

@ मर्क मैं सोच रहा था कि अगर --enable-avisynthवहाँ था, इसका मतलब है कि एविंसथ को एफएफएमपीपी में बनाया गया था, लेकिन मुझे इस बारे में निश्चित नहीं है।
लुई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.