छवि के लिए हर N सेकंड में वीडियो का एक फ्रेम कैसे निकाला जाए?


71

मैं एक वीडियो फ़ाइल को छवियों के अनुक्रम में कैसे बदल सकता हूं, उदाहरण के लिए हर एन सेकंड में एक फ्रेम। क्या mplayer या ffmpeg ऐसा कर सकता है? मैंने मैन्युअल रूप से स्क्रीनशॉट्स को हथियाने के लिए MPlayer का उपयोग किया है लेकिन मैं इसे लंबे वीडियो के लिए स्वचालित करना चाहूंगा।


छवियों की गुणवत्ता चुनने के बारे में यह संबंधित प्रश्न देखें: stackoverflow.com/questions/10225403/…
पियरज़

जवाबों:


70

यह ffmpeg के साथ बहुत सरल है, और यह अतिरिक्त स्क्रिप्टिंग के बिना हर एन सेकंड में एक फ्रेम का उत्पादन कर सकता है । एक छवि अनुक्रम के रूप में निर्यात करने के लिए आउटपुट के रूप में उपयोग या समान। बिट एक शून्य गद्देदार पूर्णांक में बदल जाती है लंबे अंक - उदाहरण मैं दे दी है के रूप में उत्पादन हो जाता हैmyimage_%04d.png%0xdx

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

    आदि..

आप अभी भी बहुत सारे छवि प्रारूप, पीएनजी, जेपीईजी, टीजीए, जो कुछ भी ( ffmpeg -formatsपूरी सूची के लिए देखें ) का उपयोग कर सकते हैं।

ठीक है अब हम जानते हैं कि छवियों के अनुक्रम के रूप में फिल्म को कैसे निर्यात किया जाए, लेकिन कहते हैं कि हम हर एक फ्रेम को निर्यात नहीं करना चाहते हैं?

चाल केवल आउटपुट के फ्रेम दर को बदलने के लिए है जो हम उस -r nविकल्प का उपयोग करना चाहते हैं जहां nफ्रेम प्रति सेकंड की संख्या है। 1 फ्रेम प्रति सेकंड होगा -r 1, हर चार सेकंड में -r 0.25एक फ्रेम होगा , हर दस सेकंड में एक फ्रेम होगा -r 0.1और इसी तरह।

तो यह सब एक साथ रखने के लिए, यह कैसे input.movहर चार सेकंड के एक फ्रेम को बचाने के लिए दिखेगा output_0000.png, output_0001.pngआदि ।:

ffmpeg -i input.mov -r 0.25 output_%04d.png

ध्यान दें कि -r 0.25विकल्प हो जाता है के बाद-i input.mov , क्योंकि यह की फ्रेम दर को नियंत्रित करने की है, भाग उत्पादन । यदि आप इसे इनपुट से पहले रखते हैं तो यह इनपुट फ़ाइल को मान लेगा जैसे कि इसमें निर्दिष्ट फ्रेम दर थी।

अगर आदेश 10,000 से अधिक फ्रेम बनाना होगा बदल हालांकि कई अंक आप की जरूरत है, जैसे करने के लिए% xd बदलें %04dकरने के लिए %05d। यह उन इनपुट फ़ाइलों के लिए भी काम करता है जो छवि अनुक्रम हैं। और अधिक पढ़ें यहाँ

विंडोज उपयोगकर्ता : कमांड लाइन के उपयोग पर%

उदाहरण: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

सीएमडी और बैट लिपियों में उपयोग करते हैं %%

उदाहरण: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

तो %%स्क्रिप्ट में डबल , और %इंटरैक्टिव कमांड लाइन पर सिंगल । किसी भी स्थिति में गलत होने से त्रुटि उत्पन्न होगी।


-rअगर मुझे हर फ्रेम का निर्यात करना है तो मुझे क्या करना चाहिए ? अगर मुझे वीडियो का FPS पता है, तो मुझे लगता है कि मैं इनपुट करता हूं, लेकिन अगर मैं नहीं करूं तो क्या होगा?
तोमा ज़ातो

4
-R ध्वज का उपयोग बिल्कुल भी न करें। तब FFMPEG इनपुट फ़ाइल के फ्रेम दर का उपयोग करेगा।
स्टिब

2
ध्यान दें कि आप वास्तव में इसके लिए उपयोग करना चाहते हैं jpegs, जब तक कि आप सुनिश्चित नहीं pngहैं कि आप क्या चाहते हैं। मेरे मामले में, jpegs लगभग 50kb प्रत्येक pngथे , और s लगभग 2MB थे।
mlissner

5
pngs का लाभ दोषरहित संपीड़न है, इसलिए यदि आप एक मध्यवर्ती के रूप में छवि अनुक्रम का उपयोग कर रहे हैं और अतिरिक्त आकार को ध्यान में नहीं रखते हैं, तो जब आप png का उपयोग कर सकते हैं।
स्टिब

इसे जोड़ने के लिए है कि लायक है -q:v 1एक बहुत ही उपयोगी विकल्प के रूप में यहाँ है superuser.com/questions/318845/...
निकोले Shmyrev

27
mplayer -vo jpeg -sstep 5 file.avi

प्रत्येक 5 सेकंड में एक jpeg फ़ाइल के रूप में एक फ्रेम बचाएगा।

हालाँकि, यह फ़ाइल के अंत में बंद नहीं होगा, यह अंतिम फ्रेम की प्रतियां बनाना जारी रखेगा। इससे बचने के लिए, सेकंड में वीडियो की अवधि का पता लगाएं, किसी अन्य खिलाड़ी का उपयोग कर, या mplayer के साथ:

mplayer -vo null -ao null -frames 0 -identify file.avi

और "ID_LENGTH = 147.00" जैसी लाइन की तलाश करें।

लंबाई से 2 घटाएं, और -endposविकल्प के लिए इस मान का उपयोग करें । उदाहरण के लिए, 147 सेकंड के वीडियो के लिए:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

यह एक mplayer बग की तरह लगता है। अच्छा काम है।
क्वैककोट

क्या आप कम से कम यह उल्लेख कर सकते हैं कि आप इस कमांड का उपयोग किस ऑपरेटिंग सिस्टम पर कर रहे हैं?
टॉम ज़ोटो 10

यह 5 साल पहले था, लेकिन यह उस समय का सबसे नया उबंटू डेस्कटॉप था, उबंटू 10.4।
लियाम

मैं 1s से कम चरणों का चयन कैसे कर सकता हूं। यह केवल पूर्णांकों को स्वीकार करता है।
22

आजकल, डेबियन पर mpv 0.27.0 का उपयोग करते हुए mpv --vo=image --sstep=5 movie.mkvउपरोक्त बग ( एमपीवी mplayer का एक कांटा है) के बिना महान काम करता है ।
एडम काटज़

11

इसके साथ ffmpeg, आप निम्न कार्य कर सकते हैं:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

यह कमांड वीडियो में 4 सेकंड में 320 × 240 आकार का जेपीजी थंबनेल उत्पन्न करता है। इसे एक स्क्रिप्ट में रखें जो समय और फ़ाइल नाम को बदलता है और आप काम कर रहे हैं।

अधिक जानकारी: वीडियो के प्रत्येक X सेकंड में एक थंबनेल छवि बनाएं


यह वही करता है जो मैं चाहता हूं, लेकिन एक समस्या के साथ। यह प्रत्येक पुनरावृत्ति पर प्रारंभ से फ़ाइल को संसाधित करेगा, तेजी से धीमा हो रहा है।
लियाम

@ लिआम - यदि आप ऑफ़सेट समय को अकेले छोड़ते हैं (इसे 1 पर सेट करें) और -ss positionझंडे का उपयोग करने के बजाय फ़ाइल में आगे की तलाश करने में मदद करता है? -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
निफले

1
@ एलिआम: इनपुट वीडियो डिकोड होने से पहले की तलाश -ssइस तरह से -iकरें कि तलाश होती रहे। इसे तेज करना चाहिए। source
क्वैक

2
Ffmpeg के साथ ऐसा करने का एक बेहतर, बहुत तेज़ तरीका है। नीचे मेरा जवाब देखें।
स्टब

stib का समाधान सबसे अच्छा IMO है।
ग्रिफिन

8

यदि आप एक प्रकार की संपर्क शीट के बाद हैं और यदि आप यूनिक्स जैसे OS के साथ काम कर रहे हैं, तो आप इस विस्तृत स्क्रिप्ट का उपयोग कर सकते हैं, जिसे बिंदु वीडियो संपर्क शीट * NIX , लघु vcs कहा जाता है

पृष्ठभूमि में यह ffmpeg(डिफ़ॉल्ट रूप से) का भी उपयोग करता है mplayer, या इसलिए बहुत सारे वीडियो प्रारूपों को संभाल सकता है। यह फिल्म से अभी भी छवियों को कैप्चर करने की प्रक्रिया को स्वचालित करता है और कुछ हेडर और फुटर के साथ एक छवि के लिए इनकी रचना करता है। आप उदाहरण के लिए चुन सकते हैं कि आप कितने कैप्चर करना चाहते हैं या वैकल्पिक रूप से उन दोनों के बीच समय का अंतर है।

10 मिनट के अंतराल के लिए, आह्वान इस तरह है:

vcs -i 10m input.avi

कुछ अन्य ट्वीक्स के लिए कमांडलाइन विकल्पों की पूरी सूची देखें ।

यहाँ एक उदाहरण संपर्क पत्रक है, जिसे मुखपृष्ठ से लिया गया है :

यहाँ छवि विवरण दर्ज करें


7

वीएलसी 1.1.0 और उससे अधिक के साथ, आप दृश्य वीडियो फ़िल्टर का उपयोग कर सकते हैं:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

उपरोक्त प्रत्येक 24 तख्ते में से 1 को बचाता है (- सीज़न-अनुपात = 24), 00:00:10 से शुरू होकर 00:00:11 पर समाप्त होता है।

बस एक नए विंडोज 8 इंस्टॉलेशन पर वीएलसी 2.0.3 के साथ इस परीक्षण का परीक्षण किया और पुष्टि की (मेरे पास कोई अतिरिक्त वीडियो प्लगइन्स या सॉफ़्टवेयर नहीं है)।

पूर्ण प्रलेखन: http://wiki.videolan.org/How_to_create_thumbnails


2

VirtualDub आपके लिए यह कर सकता है

File-> Export->Image sequence

यहाँ छवि विवरण दर्ज करें


क्या यह एक छवि के रूप में हर फ्रेम को बचाएगा?
लियाम

हाँ, हर फ्रेम।
शेवेक

मुझे अधिकांश फ़्रेमों को छोड़ने की आवश्यकता है, सभी फ़्रेमों का आउटपुट बहुत अधिक संग्रहण स्थान का उपयोग करेगा। मुझे हर कुछ सेकंड में सिर्फ एक फ्रेम चाहिए।
लियाम

1

आप भी यह कोशिश कर सकते हैं

VLC कमांड लाइन से ...

vlc "C: \ your \ file \ path \ file.avi" -V छवि --image-out-prefix = capname --image-out-ratio = 60

file.avi वह वीडियो है जिसे आप कैप्चर करना चाहते हैं, capname सहेजे गए चित्रों का उपसर्ग है, आप अनुपात के साथ खेलना चाहते हैं (60 का मतलब है कि 60 में से 1 चित्र कैप्चर किया गया है) आप उदाहरण के लिए और कमांड जोड़ सकते हैं। --image-out-format jpeg आपके कैप को pngs के बजाय jpegs के रूप में बचाएगा, --snapshot-path आपको यह चुनने देता है कि आपको अपनी कैप को कहाँ सहेजना है।

ऊपर का स्रोत


मुझे यह संदेश मिला: कमांड लाइन विकल्प लोड नहीं किया जा सकता है, जांचें कि वे वैध हैं।
लियाम

अज्ञात विकल्प या लापता अनिवार्य तर्क `--image बाहर उपसर्ग = capname ': उबंटू पर, मैं इस संदेश मिला
लियाम

1

आप VirtualDub में फ़्रेम को छोड़ सकते हैं। बस वीडियो -> फ़्रेम दर मेनू में स्थित "डिक्यिम बाय" विकल्प का उपयोग करें। उदाहरण के लिए यदि आप "100 तक का निर्णय लेते हैं" तो फ़ाइल -> निर्यात -> छवि अनुक्रम का उपयोग करें, यह केवल हर 100 वें फ्रेम को बचाएगा।

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