एक MP4 वीडियो के फ्रेम दर को ffmpeg के साथ बदलें


9

मेरे पास mp4 प्रारूप में एक वीडियो है जिसमें फ्रेम दर .33(3 सेकंड के लिए 1 फ्रेम) है। मैं फ्रेम दर को 5 फ्रेम / सेकंड तक बढ़ाना चाहता हूं। मैंने नीचे कमांड की कोशिश की है, लेकिन यह कोई काम नहीं करता है:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

किसी भी विचार क्यों ffmpeg -rविकल्प की अनदेखी कर रहा है?


आप तेजी लाने के लिए प्रयास कर रहे हैं /, एक वीडियो को धीमा डुप्लिकेट / ड्रॉप फ्रेम के बजाय, देखने superuser.com/questions/854753/... और / या askubuntu.com/questions/370692/...
पीटर Cordes

जवाबों:


6

यदि इनपुट फ़ाइल में एक वैध फ्रेम दर नहीं है, तो आपको इसे स्पष्ट रूप से सेट करना पड़ सकता है

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

यह ट्रांसकोड तब होता है जब आपको वास्तव में केवल रिमूव करना होता है। (जब तक आप वास्तव में वीडियो को धीमा / तेज़ करने के बजाय फ़्रेम / डुप्लिकेट करना / छोड़ना चाहते हैं।)
पीटर कॉर्डेस

6

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन वर्तमान उत्तरों में से कोई भी अब अनुशंसित तरीका नहीं है।

दोषरहित (वीडियो) रीमेकिंग

जैसा कि टिप्पणियों में उल्लेख किया गया है, ऐसा करने का एक तरीका है जहां वीडियो को फिर से एनकोड नहीं करना पड़ता है । यह जरूरी है remuxing एक अलग containter प्रारूप MKV करने के लिए फ़ाइल और फिर इसे एक MP4 में वापस remuxing। यहाँ एक उदाहरण है जो एक वीडियो को 12 फ़्रेम / सेकंड में बदलता है:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

यदि वीडियो में ऑडियो है तो आप पिच को बदले बिना उसे धीमा भी कर सकते हैं, लेकिन यह दोषरहित रूपांतरण नहीं है। नीचे दिया गया उदाहरण स्रोत वीडियो को 24 फ्रेम / सेकंड मानता है ताकि ffmpeg के एटेम्पो फिल्टर का उपयोग करके ऑडियो को आधा (0.5) गति से धीमा करने की आवश्यकता हो ।

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

एफएफएमपीजी विकी गाइडेंस

यह ffmpeg विकि से मार्गदर्शन है । ध्यान दें कि इन सभी विकल्पों में वीडियो को फिर से एन्कोडिंग करने की आवश्यकता होती है।

वीडियो को गति देना / धीमा करना

आप सेटिफ़ वीडियो फ़िल्टर का उपयोग करके वीडियो स्ट्रीम की गति को बदल सकते हैं। ध्यान दें कि निम्नलिखित उदाहरणों में, ऑडियो स्ट्रीम नहीं बदला गया है, इसलिए इसे आदर्श रूप से -an के साथ अक्षम किया जाना चाहिए।

वीडियो की गति को दोगुना करने के लिए, आप इसका उपयोग कर सकते हैं:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

फ़िल्टर प्रत्येक वीडियो फ्रेम की प्रस्तुति टाइमस्टैम्प (PTS) को बदलकर काम करता है। उदाहरण के लिए, अगर टाइमस्टैम्प 1 और 2 में दो आत्मघाती फ्रेम दिखाए गए हैं, और आप वीडियो को गति देना चाहते हैं, तो उन टाइमस्टैम्प को क्रमशः 0.5 और 1 बनने की आवश्यकता है। इस प्रकार, हमें उन्हें 0.5 से गुणा करना होगा।

ध्यान दें कि यह विधि वांछित गति प्राप्त करने के लिए फ़्रेम को गिरा देगी। आप इनपुट की तुलना में उच्च आउटपुट फ्रेम दर निर्दिष्ट करके गिराए गए फ़्रेम से बच सकते हैं। उदाहरण के लिए, 4 एफपीएस के इनपुट से जाने के लिए जो 4x तक स्प्रेड है (16 एफपीएस):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

अपने वीडियो को धीमा करने के लिए, आपको 1 से अधिक गुणक का उपयोग करना होगा:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

चिकना

आप मिन्टरपोलेट वीडियो फिल्टर के साथ धीमी / तेज वीडियो को आसानी से बाहर निकाल सकते हैं। इसे "गति प्रक्षेप" या "ऑप्टिकल प्रवाह" के रूप में भी जाना जाता है।

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

अन्य विकल्पों में स्लोमोविडियो और बटरफ्लो शामिल हैं। ऑडियो को तेज़ / धीमा करना

आप एटमपो ऑडियो फ़िल्टर के साथ ऑडियो को गति या धीमा कर सकते हैं। ऑडियो की गति को दोगुना करने के लिए:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

एटेम्पो फिल्टर 0.5 और 2.0 के बीच मूल्यों का उपयोग करने के लिए सीमित है (इसलिए यह इसे कम से कम मूल गति से कम नहीं कर सकता है, और इनपुट से दोगुना से अधिक नहीं हो सकता है)। यदि आप की जरूरत है, तो आप एक साथ कई atempo फिल्टर स्ट्रिंग द्वारा इस सीमा के आसपास प्राप्त कर सकते हैं। ऑडियो गति को चौगुनी करने के साथ निम्नलिखित है:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

एक जटिल फ़िल्टरग्राफ का उपयोग करके, आप एक ही समय में वीडियो और ऑडियो को गति दे सकते हैं:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

1
यह केवल रीमूक्सिंग द्वारा गति / धीमा करना संभव है, लेकिन FFmpeg यह नहीं जानता कि यह कैसे करना है । उदाहरण के लिए, mkvtoolnix कर सकते हैं। उदा । mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv एमकेवी कंटेनर पर फ्रैमर्ट बदलें । आप MKV और MP4 पर वापस जा सकते हैं, या एक उपकरण पा सकते हैं जो इसे सीधे MP4 के लिए करता है। वीडियो को एक्सकोडिंग बहुत सीपीयू-गहन और हानिपूर्ण है, इसलिए यह एक भयानक विकल्प है।
पीटर कॉर्डेस

पूरी तरह से सहमत हैं कि कम फ्रैमरेट को रीमेक करना पसंद किया जाता है क्योंकि यह एक दोषरहित दृष्टिकोण है जो बहुत कम संसाधन गहन है। व्यवहार में मुझे MP4s के साथ ऐसा करने के लिए अच्छा टूलिंग नहीं मिला है। मैंने वास्तव में हाल ही में कोशिश नहीं की है, लेकिन जब मैंने पहली बार यह उत्तर लिखा था तो मैंने MP4-> MKV-> MP4 रीमूक्सिंग किया था और मैं इसे mkvtoolnix, ffmpeg और / या mp4box का उपयोग करके काम करने के लिए नहीं प्राप्त कर सका। मुझे आपके द्वारा सुझाए गए मापदंडों के साथ प्रयास करना होगा।
स्यूडोसैवैंट

3

यदि इनपुट फ़ाइल को "रॉ" फ़ाइल के रूप में वर्गीकृत किया गया था, तो मैं केवल प्रभावी फ्रैमरेट प्राप्त कर सकता था।

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

निर्दिष्ट किए बिना -f h264यह 25 एफपीएस पर डिफ़ॉल्ट होगा और इसे बदला नहीं जा सकता है। जाहिरा तौर पर इसका कारण यह था कि स्ट्रीम में किसी भी फ्रैमरेट जानकारी का अभाव था और यह ffmpeg का डिफ़ॉल्ट फ्रैमरेट है।

जाहिरा तौर पर जब आप -rएक आउटपुट विकल्प के रूप में उपयोग करते हैं तो यह फ्रेम को डुप्लिकेट या ड्रॉप करता है इसलिए वीडियो उसी गति से खेलता है - इस मामले में, जो आप चाहते हैं वह नहीं! लेकिन ऊपर के रूप में इनपुट फ्रैमरेट को बदलने से वीडियो को तेज या धीमा हो जाएगा, जिसमें कोई फ्रेम नहीं खो जाएगा या डुप्लिकेट नहीं होगा।


1
मेरा उपयोगी जवाब। कोई फिर से एन्कोडिंग यहाँ
Yota

1

इस तरह की एक विशेषता - बदलते फ्रैमरेट की - को "अनुरूपता" कहा जाता है और इसका उपयोग अक्सर धीमी गति या तेजी से आगे बढ़ने के लिए किया जाता है जैसे कि पौधों की वृद्धि को मिनटों में दिखाया जाता है। Ffmpeg ओवरराइटिंग / रि-एन्कोडिंग के बिना फ्रैमर्ट को बदलने की अनुमति नहीं देता है । यदि ऐसा होता है, तो अवधि बदल जाएगी और ऑडियो सिंक से बाहर हो जाएगा जब तक कि अलग से मेल नहीं किया जाता है। लेकिन मुझे डर है कि ऑडियो आपके मामले में रूचि का नहीं है

आप कन्फर्म करना चाहते हैं क्योंकि आप सिर्फ फ्रैमरेट बदलना चाहते हैं, लेकिन ffmpeg -rचुपचाप नजरअंदाज कर देता हैयदि फ्रैमरेट इनपुट फ़ाइल में निर्दिष्ट है। चूँकि आपकी इनपुट फ़ाइल .mp4 प्रारूप में है, इसलिए इसका स्वयं का फ्रेमरेट पूर्ववर्ती है-rजब फिर से सांकेतिक शब्दों में बदलना की जरूरत नहीं है। इसके लिए आपको एक अलग टूल की आवश्यकता होती है: mencoder।

अपनी इनपुट फ़ाइल को मानने में कोई भी ध्वनि नहीं है - .33 फ़्रैमरेट के साथ किसी भी वीडियो के लिए संभावित रूप से सत्य है - आपको क्या चाहिए:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

ध्यान दें कि डिफ़ॉल्ट रूप से mencoder AVI प्रारूप में उत्पादन करता है।


1
ये गलत है। यदि rइसे आउटपुट स्विच के रूप में निर्दिष्ट किया जाता है, तो ffmpeg इनपुट के फ्रैमरेट के बावजूद उस निर्दिष्ट फ्रैमरेट में एक आउटपुट उत्पन्न करेगा। यदि rइनपुट स्विच के रूप में निर्दिष्ट किया गया है, तो फ़िल्टर / एनकोडर में इनपुट के प्रति सेकंड फ्रेम की निर्दिष्ट संख्या को खिलाने के लिए ffmpeg फ्रेम को डुप्लिकेट या ड्रॉप करेगा।
ज्ञान १

आपके द्वारा प्रयोग किए जाने वाले व्यवहार का वर्णन जब rमेरे इनपुट पर .mp4 प्रारूप, माल्विनस 'नोट (इस पृष्ठ पर) और बग विवरण 403 trac.ffmpeg.org/ticket/403 पर किए गए इनपुट स्विच विरोधाभासों के साथ होता है ; rजब पुन: एन्कोडिंग करते समय आउटपुट पर उपयोग किया जाता है, तो आपका विवरण , जबकि ओपी का परिदृश्य एक अनुरूप मामला लगता है (रि-एन्कोडिंग के बिना फ्रेम को ठीक करना) इस तथ्य से कि उसके पास .33 फ़्रैमरेट है।
टेंकमैन '

1
यहां चिपकाई गई रिपोर्ट की जांच करें । शीर्ष पर कमांड लाइन पर ध्यान दें, इनपुट और आउटपुट मेटाडेटा और अंत में नहीं। फ्रेम के एन्कोडेड।
ज्ञान १

1
सहमत हैं कि ओपी केवल फ़ाइल को संधारित करना चाहता है, लेकिन कॉपी स्विच (एस) के बाद से उनकी दी गई कमांड फिर से एन्कोडिंग है। उस परिदृश्य में, ffmpeg को rएफपीएस पर नई धारा उत्पन्न करनी चाहिए ।
ज्ञान

सॉल्विंग सैंपल आउटपुट के लिए मुलव्या को धन्यवाद। हां, आप इसके उपयोग पर सही हैं -r। यह प्रयोग ओपी के जवाब में मेरे पहले के प्रयोगों को प्रभावित नहीं कर सका, क्योंकि एक अनुरूप मामले में, मैंने कभी भी ffmpeg से कॉपी पैरामीटर नहीं गिराया, और -rइस तरह से इसे नजरअंदाज कर दिया गया। मैंने एक फीचर अनुरोध लिखा है: trac.ffmpeg.org/ticket/5170
六四
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.