2012-01-30 14 views
7

से मुख्य फ्रेम निष्कर्षण मुझे वीडियो/स्ट्रीम से कुंजी फ्रेम्स निकालने की आवश्यकता है। तो क्या कोई मानक कार्यान्वयन है। मैं खुली सीवी का उपयोग कर रहा हूं। (वर्तमान में मैं धीमी गति से प्रत्येक सेकेंड में फ्रेम निकालने जा रहा हूं, मुझे प्रदर्शन में सुधार करने की आवश्यकता है।) तो अगर किसी ने कार्यान्वयन को अनुकूलित किया है तो कृपया यहां जवाब दें।वीडियो

उत्तर

12

ffmpeg का उपयोग करते हुए आप निम्नलिखित कोड का उपयोग कर सभी प्रमुख तख्ते निकाल सकते हैं:

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i yourvideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg 

क्या -vf एक ffmpeg कमांड लाइन में इस प्रकार एक Filtergraph वर्णन है। चयन फ़िल्टर आउटपुट में पास करने के लिए फ्रेम का चयन करता है। फ़िल्टर का निरंतर "pict_type" और मान "PICT_TYPE_I" है। तो ffmpeg केवल आउटपुट में कुंजी फ्रेम पास कर रहा है।

-vsync 2 प्रत्येक कुंजी फ्रेम के लिए एक से अधिक प्रति उत्पन्न करने के लिए ffmpeg को रोकता है।

-f image2 छवि फ़ाइलों को वीडियो फ्रेम लिखता है। आउटपुट फ़ाइल नाम एक पैटर्न द्वारा निर्दिष्ट किए जाते हैं, जिनका उपयोग अनुक्रमिक रूप से क्रमांकित श्रृंखलाओं की श्रृंखला के उत्पादन के लिए किया जा सकता है। पैटर्न में "% d" या "% 0Nd" स्ट्रिंग हो सकती है।

संदर्भ: http://www.videoproductionslondon.com/blog/scene-change-detection-during-encoding-key-frame-extraction-code

+0

ओपनसीवी में इसे कैसे करें? – Treper

+1

मुझे 'अनिर्धारित स्थिर या अनुपलब्ध '(' PICT_TYPE_I में '' ' – puk

+1

हैलो! यह एक मूल्यवान कमांड है, हालांकि इसका ऑर्डर गलत है और आप छवियों को फिर से आकार दे सकते हैं। आपको सब कुछ पहले, पहले -i video.mp4 रखना चाहिए। यह इस प्रकार है: ffmpeg -i "yourInputVideo.mp4" -vf select = "eq (pict_type \, PICT_TYPE_I)" -vsync 2 -f image2 थंबनेल_% 02d.jpeg –

6

मुझे लगता है कि कीफ्रेम एक फ्रेम प्रस्तुत करने वाली सामग्री पिछले लोगों से बहुत अलग है (यह औपचारिक परिभाषा नहीं है, लेकिन यह फिट बैठती है)। फ्रेम लें i और i + 1। सभी पिक्सल मतभेदों का योग प्राप्त करने के लिए फ्रेम और cv2.sumElems के बीच अंतर की गणना करने के लिए cv2.absDiff का उपयोग करें। यह सभी फ्रेम i के लिए करें। इससे आपकी वीडियो स्ट्रीम एक आयामी सिग्नल तक कम हो जाएगी। इस सिग्नल में चोटियों देखें और इन चोटियों से संबंधित कीफ्रेम चुनें।

+0

मुझे आरजीबी मूल्यों के लिए sumElems() से एक स्केलर लौटाया गया है। इस स्केलर को सबसे बढ़िया तरीका कैसे संभालें? योग आरजीबी चैनल? केवल एक निश्चित चैनल पर ध्यान केंद्रित करें? – sschrass

+0

आरजीबी चैनलों को समेटें या सिर्फ ग्रेस्केल का उपयोग करें। –

+0

क्या आप चोटी पर फ्रेम ढूंढने के लिए नमूना कोड साझा कर सकते हैं – geek

1

ffmpeg समाधान अच्छी तरह से काम करना चाहिए।

किसी को चुनिंदा फ़िल्टर 'eq (pict_type \, PICT_TYPE_I)' के साथ समस्याओं का सामना करने के लिए, आप फ़िल्टर को 'eq (pict_type \, I)' के रूप में आज़मा सकते हैं। यह थोड़ी देर के लिए टूट गया था इसलिए ffmpeg के कुछ संस्करण निरंतर पहचान नहीं सकते हैं। फिक्स here देखा जा सकता है।

अंतिम आदेश जो मेरे लिए अंत में काम किया था:

ffmpeg -vf select='eq(pict_type\,I)' -i yourVideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg 
2

अगर कुछ ऊपर कोड के साथ गलत, इस तर्क के क्रम आज़मा सकते हैं।

ffmpeg -i yourVideo.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg 
0

आप कुंजी फ्रेम निकालने के लिए ffprobe का उपयोग कर सकते हैं। यह ffmpeg में एक उपकरण है।

ffprobe in.mp4 -select_streams v -show_entries frame = key_frame, pkt_pts_time -of csv = nk = 1: p = 0 | findstr "1,"

+0

कुछ और जानकारी चाहिए –

संबंधित मुद्दे