पीएनजी फ्रेम को 1 एफपीएस पर वीडियो में परिवर्तित करना


21

मेरे पास 1 एफपीएस में पीएनजी प्रारूप में वीडियो फ्रेम हैं और मैं उन्हें एफएफएमपीपी का उपयोग करके वीडियो में बदलने की कोशिश कर रहा हूं।

अगर मैं ऐसा कुछ करता हूं:

ffmpeg -i data/input-%4d.png data/output.mp4

मुझे 25FPS पर एक वीडियो मिलता है जो मूल रूप से इनपुट का बहुत तेज़-फॉरवर्ड है (जो 1FPS पर कैप्चर किया गया है)।

अगर मैं कोशिश करूँ:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

मुझे कुछ ऐसा मिला है जिसे VLC खेलना नहीं चाहता है :)

अब, अगर मैं पहला वीडियो (FF एक) लेता हूं और इसे धीमा करने के लिए एक फ़िल्टर लागू करता -filter:v 'setpts=24.0*PTS'हूं (जैसे ), तो मैं इसे 1 FPS वीडियो की तरह खेलने के लिए प्राप्त कर सकता हूं, लेकिन निश्चित रूप से कीमत फ़ाइल आकार की है। मुझे लगता है कि यह दोहराया तख्ते का एक गुच्छा पैदा कर रहा है।

तो, सवाल यह है कि मैं एक वीडियो कैसे बनाऊं जिसमें वास्तव में 1 एफपीएस हो और वास्तव में उस गति से खेलता हो? आउटपुट स्वरूप, btw, मेरे लिए उतना महत्वपूर्ण नहीं है।


मुझे यकीन नहीं है कि ffmpegकेवल कंटेनर प्रारूप फ़ाइल एक्सटेंशन से वीडियो कोडेक का पता लगाने के लिए पर्याप्त स्मार्ट है .mp4,। -vcodec libx264 -vpre hqकमांड लाइन में जोड़ने की कोशिश करें , इसे कोडेक और एन्कोडिंग मापदंडों को बताने के लिए।
वारेन यंग

यह वास्तव में यह ठीक है, और मैंने कहा कि यह अच्छी तरह से काम किया है और केवल अजीब परिणाम का उत्पादन किया जब मैंने जोड़ा -r 1
असफ लवी

मुझे लगता है कि आप stackoverflow.com या superuser.com पर एक ffmpeg उत्तर पर बेहतर किस्मत पा सकते हैं ।
डेमियन

जवाबों:


19

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

ffmpeg -r 1 -i डेटा / इनपुट-% 4d.png -pix_fmt yuv420p -r 10 डेटा / output.mp4

-r 1साधन वीडियो के 1 पर खेलेंगे मूल छवियों प्रति सेकंड। साधन वीडियो प्रति सेकंड 10 फ्रेम में खेलेंगे।
-r 10

( -pix_fmt yuv420pप्लेबैक कार्यक्रमों की एक विस्तृत श्रृंखला के साथ संगतता सुनिश्चित करने के लिए बस यह है। यहां यह आवश्यक है, उदाहरण के लिए, वीडियो विंडोज मीडिया प्लेयर द्वारा चलाया जा सकता है।)

मैंने कई अलग-अलग आउटपुट फ़्रैमरेट्स का परीक्षण किया, और लगता है कि 10 सबसे कम संख्या है जो आप उपयोग कर सकते हैं जो अभी भी एक वीडियो का उत्पादन करेगा जो वीएलसी खेलेंगे।

बेशक, ऊपर दिए गए आदेश का मतलब है कि प्रत्येक मूल छवि को गुणा किया जा रहा है, लेकिन यह आपके द्वारा उल्लेखित "इसे धीमा" करने की तुलना में एक सरल विधि है, और कोडेक के आधार पर यह एक सच्चे 1-एफपीएस की तुलना में बहुत बड़ा वीडियो नहीं बना सकता है वीडियो।

इसका परीक्षण करने के लिए, मैंने सिर्फ 1-FPS वीडियो का निर्माण किया, जो 2.24 kiB पर आता है। मैंने तब एक ही इनपुट छवियों के साथ एक वीडियो का उत्पादन किया, लेकिन 24 एफपीएस पर आउटपुट, और यह 5.76 kiB तक निकला। यह आकार से दोगुना अधिक है, और आकार के 24 गुना के आसपास कहीं नहीं है। :)


+1 on -pix_fmt कुछ लोगों को भूलना आसान WMP :-)
स्मॉलटाउन 2k

आप आउटपुट स्वरूप को 10 एफपीएस क्यों चाहते हैं जबकि इनपुट केवल 1 है? क्या यह 90% निरर्थक फ्रेम नहीं बनाएगा जो बिल्कुल एक जैसे हों?
हरबर्ट

@ हर्टबर्ट यह निरर्थक फ्रेम बनाता है ताकि आप फ्रेम दर 10 तक प्राप्त कर सकें, जो कि सिर्फ इसलिए किया जाता है ताकि वीएलसी शिकायत न करे , और यह नेत्रहीन वीडियो को परिवर्तित नहीं करता है। एनकोडर स्मार्ट पर्याप्त है कि फ्रेम सभी समान हैं देखने के लिए तो आप एक बहुत बड़ा फ़ाइल के साथ अंत नहीं है
chiliNUT

@chiliNUT स्पष्ट, कीफ़्रेम चीज़, जो सभी प्रारूप नहीं, लेकिन अधिकांश समझदार प्रारूप करेंगे। धन्यवाद!
हर्बर्ट

5

दोनों का उपयोग करें -framerateऔर-r

जैसे, एक अंतिम वीडियो जो 1FPS जैसा दिखता है:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

यह पीएनजी फ्रेम को 1 एफपीएस पर वीडियो में लाने के समान है यूनिक्स एंड लिनक्स स्टैक एक्सचेंज कहता है, लेकिन मुझे -framerateइसके बजाय -rकाम करने की आवश्यकता थी ।

यह विकी पर उल्लिखित है: http://trac.ffmpeg.org/wiki/Slideshow#Framates

यह आउटपुट फ्रैमरेट को सेट करता है 30, जिसे VLC प्रत्येक छवियों को 30 बार संभाल सकता है, और कॉपी कर सकता है, ताकि आउटपुट वीडियो 1 FPS पर दिखाई दे। इसे भी देखें: Ffmpeg का उपयोग करके छवियों से कम एफपीएस वीडियो के साथ वीएलसी में प्लेबैक मुद्दे स्टैक ओवरफ़्लो

VLC फिर सामान्य रूप से वीडियो चलाने में सक्षम है।

ffmpeg10 पीएनजी के साथ एक निर्देशिका में उबंटू 16.10, वीएलसी 2.2.4, 3.0.5 पर परीक्षण किया गया ।

इसे भी देखें: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg


बीच क्या अंतर है -rऔर -framerate?
रॉय

@ रोई मैं वास्तव में नहीं जानता, सिवाय इसके कि यह मेरे लिए काम करने वाली एक ही चीज़ है :-) लेकिन अगर आप इसे manपृष्ठों से निकालने में कामयाब रहे , तो मुझे बताएं; ;-) एक सार्थक उद्धरण है "-r के रूप में; इनपुट विकल्प, फ़ाइल में संग्रहीत किसी भी टाइमस्टैम्प को अनदेखा करें और इसके बजाय स्थिर फ्रेम दर को मानते हुए टाइमस्टैम्प उत्पन्न करें। यह वही नहीं है जैसे कि इमेज 2 या v4l2 जैसे कुछ इनपुट प्रारूपों के लिए उपयोग किए जाने वाले -फ्रामरेट विकल्प का उपयोग किया जाता है (यह पुराने संस्करणों में समान होता था। FFmpeg)। यदि संदेह है तो इनपुट विकल्प के बजाय -framerate का उपयोग करें -r। "
सिरो सेंटिल्ली 新疆 改造 iro i 事件

3

क्या होगा यदि आप अपने दूसरे उदाहरण को थोड़ा बढ़ाते हैं:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

-r 1.Png फ़ाइलों से पहले आने की जरूरत है, के बाद नहीं।

से FFmpeg प्रलेखन :

एक सामान्य नियम के रूप में, विकल्प अगले निर्दिष्ट फ़ाइल पर लागू होते हैं। इसलिए, आदेश महत्वपूर्ण है, और आपके पास कमांड लाइन पर एक ही विकल्प कई बार हो सकता है। प्रत्येक घटना को अगले इनपुट या आउटपुट फ़ाइल पर लागू किया जाता है।


दुर्भाग्य से यह काम नहीं करता है। हालांकि, यह उल्लेख करते हुए कि आदेश महत्वपूर्ण है मुझे बहुत समय बचाया गया है। धन्यवाद।
मोहम्मद नौरेलिन

0

यह वीएलसी में एक बग है (जो अभी भी संस्करण 3.0.6 में मौजूद है)। कुछ प्रयोगों के बाद मुझे महसूस हुआ कि वीएलसी 10 से कम एफपीएस वाले वीडियो के लिए क्रैश हो जाता है । तो 10 एफपीएस या अधिक वाले सभी वीडियो में कोई समस्या नहीं होनी चाहिए। तो वर्तमान में 1 एफपीएस के साथ एक वीडियो प्राप्त करने का कोई साफ तरीका नहीं है जो वीएलसी में खेलने योग्य है ( हार नहीं मानें, पढ़ते रहें )।

एक वर्कअराउंड -as ऊपर दिए गए उत्तर में दिखाया गया है- छवियों को डुप्लिकेट करके 1 एफपीएस के प्रभाव को नकली करने के लिए (जब हमारे पास वास्तव में एफपीएस 10 या उससे अधिक के बराबर होता है, जो वीएलसी के लिए ठीक है)।

उदाहरण: यदि आपके पास 12 छवियों वाला एक फ़ोल्डर है, और आप 1 एफपीएस (जो वीएलसी में खेलने योग्य है) के साथ एक वीडियो बनाना चाहते हैं, तो आपको प्रत्येक छवि को कई बार डुप्लिकेट करने की आवश्यकता है (चलो 10 बार कहते हैं), और फिर एफएफएमपीईजी बताएं 10 एफपीएस वीडियो बनाने के लिए। इस तरह से हमें 120 के कुल फ़्रेम के साथ एक वीडियो मिलेगा, जहां प्रत्येक छवि 1 सेकंड के लिए खेली जाएगी (जैसा कि 10 बार दोहराया गया है), जो कि 1 एफपीएस के लिए केवल एक नकली है।

मैं इसके बजाय पैरामीटर का उपयोगfps-r करना पसंद करता हूं (जो दूसरे उत्तर में दिखाया गया है) जो किसी मामले में समस्याग्रस्त हो सकता है ( आधिकारिक दस्तावेज के अनुसार )।

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

चूंकि इनपुट -framerateआउटपुट से कम है fps, FFMPEG आपके वांछित आउटपुट फ्रेम रेट (जो कमांड के अनुसार 10 है) तक पहुंचने के लिए फ्रेम को डुप्लिकेट करेगा।

यह भी है नोटिस करने के लिए महत्वपूर्ण है कि के आदेश -framerateऔर -vf fpsमहत्वपूर्ण है , के रूप में इस विन्यास अगले उल्लेख वीडियो (in- या उत्पादन) को लागू किया जाएगा। यह आधिकारिक डॉक्स के अनुसार है :

विकल्प अगली निर्दिष्ट फ़ाइल पर लागू होते हैं। इसलिए, आदेश महत्वपूर्ण है ...

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