वीडियो क्लिप से सभी प्रमुख फ़्रेम कैसे निकालें?


10

मैं एक वीडियो क्लिप से मुख्य फ्रेम निकालने की कोशिश कर रहा हूं। मैंने निम्नलिखित कमांड की कोशिश की, लेकिन यह सभी फ़्रेमों को निकालता है।

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg

जवाबों:


20

आप वीडियो फ़िल्टर -skip_frameकी आवश्यकता के बिना इस सरल का उपयोग कर सकते हैं select:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg

2
कमाल है, चुनिंदा फ़िल्टर के साथ 3 मिनट से अधिक की तुलना में 20 मिनट के वीडियो पर 10 से कम समय लगता है!
पागल

-threads 1डिफ़ॉल्ट की तुलना में इसका उपयोग करना सुनिश्चित करें , -threads autoयह मेरे सिस्टम पर उपवास के रूप में एक cropdetectफिल्टर ग्राफ ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) 2x बनाता है (60s 30 से नीचे)!
Genpfault

मैं Skip_frame nokey का उपयोग नहीं करूंगा। क्या आपने आउटपुट भी चेक किया है? मेरी फाइलों और बिल्ड (अगस्त 2019) में मुझे अनुचित समय के टिकट मिलते हैं, जैसे कि नोकी मुझे आई फ्रेम से पहले पूर्ववर्ती फ्रेम देता है, जबकि नॉनफिल्ड / सभी फ्रेम आई फ्रेम को बाद के समय के स्टैंप पर दिखाते हैं।
जेसनएक्सए

@Genpfault का उपयोग करने का कारण यह -threads 1है कि अन्यथा आउटपुट कीफ्रेम के अनुक्रम को आउट-ऑफ-ऑर्डर जारी किया जा सकता है। यदि आपके पास इस समस्या से निपटने के कुछ प्रकार के बाद के तरीके हैं, तो आप मल्टी-थ्रेडिंग को बरकरार रख सकते हैं। इसके अलावा, ऐसा लगता है कि अभी भी आउट-ऑफ-ऑर्डर कीफ्रेम प्राप्त करना संभव है, यहां तक ​​कि उपयोग करते समय भी -threads 1 , लेकिन अब इस मामले में ऐसी सभी घटनाएं एक h264 डिकोडर त्रुटि के साथ / झंडी दिखाती हैं illegal short term buffer state detected
ग्लेन स्लेडेन

12

selectऔर scaleफिल्टर का उपयोग करके उदाहरण :

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

कुछ सुझाव:

  • फ़िल्टर -iविकल्प से पहले नहीं आने चाहिए , क्योंकि वे एक आउटपुट विकल्प हैं। मुझे नहीं पता कि वास्तव में आपको कहां से कमान मिली है, लेकिन PICT_TYPE_Iमौजूद नहीं है - यह होना चाहिए I

  • में scaleफिल्टर आप की जगह ले सकता 73है या 41जैसे: फिल्टर करने के लिए स्वचालित रूप से चौड़ाई या ऊंचाई पक्षानुपात बनाए रखने के गणना scale=73:-1या scale=-1:41। यह स्ट्रेचिंग या स्क्विशिंग को रोकता है जो "मजबूर" स्केलिंग के परिणामस्वरूप हो सकता है।

  • आउटपुट गुणवत्ता को -qscale:v(या उपनाम -q:v) के साथ नियंत्रित किया जा सकता है । प्रभावी रेंज 2 से 31 का एक रैखिक पैमाने है और एक कम मूल्य एक उच्च गुणवत्ता है।

  • अपने यही कारण है कि ffmpegएक फिल्टर से पहले इनपुट मुझसे कहता है की अनुमति देता है यह पुराना हो सकता है। अपने ऑपरेटिंग सिस्टम के लिए हाल ही में स्थैतिक बिल्ड डाउनलोड करें, या यदि ऊपर काम नहीं करता है तो संकलन गाइड के अनुसार इसे स्वयं बनाएं


1
यदि आपका लक्ष्य प्रमुख फ्रेम को दोषरहित रूप से निकालना है, तो आप निम्न प्रयास कर सकते हैं:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
पेल्टियर

0

यदि यह त्रुटियां errors

विकल्प vf (वीडियो फिल्टर सेट करें) इनपुट url 1508.mp4 पर लागू नहीं किया जा सकता - आप आउटपुट फ़ाइल या इसके विपरीत इनपुट विकल्प लागू करने का प्रयास कर रहे हैं। इस विकल्प को उस फ़ाइल से पहले ले जाएँ, जिसका वह संबंधित है। इनपुट फ़ाइल 1508.mp4 के लिए पार्स करने के विकल्प में त्रुटि। इनपुट फ़ाइलों को खोलने में त्रुटि: अमान्य तर्क

तुम यह केर सकते हो:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

"-I" पैरामीटर पहले से

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.