Ffmpeg के साथ सटीक फ्रेम में वीडियो काटना फ़िल्टर का चयन करें


16

मापदंडों का उपयोग करने -ssऔर खोजने के बजाय -to, जो बहुत सटीक नहीं लगता है, क्या मैं दिए गए फ्रेम नंबरों के लिए वीडियो काट सकता हूं? उदाहरण के लिए;

ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm

[560० वें फ्रेम और ५६० वें फ्रेम शामिल। इसलिए, कुल के रूप में यह (560 - 80 +1) फ्रेम बनाता है]

उत्तर और थोड़ी खोज के बाद, मैंने कुछ कमांड की कोशिश की है। लेकिन अभी तक मुझे कोई स्वीकार्य तरीका नहीं मिला।

अगर कोई 250 वीं और 750 वीं फ्रेम के बीच वीडियो स्ट्रीम में कटौती करना चाहता है, तो यह जाने का तरीका है। यह आउटपुट के रूप में 501 फ्रेम देगा:

नोट: movie.mp4 में 25 एफपीएस हैं, और इसकी ऑडियो नमूना दर 48k है

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm

उम्मीद के मुताबिक, आउटपुट 20 सेकंड लंबा है, बिल्कुल।

ऑडियो के लिए समान विधि का उपयोग करना:

ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm

अप्रत्याशित रूप से, यह बहुत खराब सटीकता है। इसमें मुझे 960001 (960k + 1) सैंपल देने चाहिए थे जो 20 सेकंड के ऑडियो के बराबर थे। लेकिन इसके बजाय, आउटपुट 20.505 सेकंड लंबा था और इसमें 984240 नमूने थे। साथ ही, यदि मैं अवधि बढ़ाता हूं, तो त्रुटि भी बढ़ जाती है।

तब मैंने ऑडियो स्ट्रीम को काटने के लिए -to पैरामीटर का उपयोग करने की कोशिश की:

ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm

पुराना क्लासिक तरीका बेहतर काम करता है। आउटपुट 20.003 सेकंड लंबा था और इसमें 960144 नमूने हैं। साथ ही, बढ़ती अवधि त्रुटि को बढ़ाती नहीं है, त्रुटि स्थिर है, उस इनपुट फ़ाइल के साथ हमेशा 144 नमूने अधिशेष हैं।

सममिंग: selectफ़िल्टर ज्यादातर समय अच्छी तरह से काम करता है लेकिन एक चयन नहीं होता है। क्लासिक -ssपैरामीटर ऑडियो के लिए बेहतर काम करते हैं, लेकिन नमूना-सटीक नहीं। इसके अलावा, यह एक साथ उपयोग -vf selectऔर -ssमापदंडों के लिए संभव नहीं है , क्योंकि -ssयह ऑडियो और वीडियो स्ट्रीम दोनों को प्रभावित करेगा जबकि हम चाहते हैं कि यह केवल ऑडियो को प्रभावित करे।

इसलिए, मीडिया फ़ाइल को ठीक से काटने के लिए मुझे ये 3 चरण करने होंगे:

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm 
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm 
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy  movie-between_10th_and 20th_seconds.webm

यह सबसे सटीक परिणाम देता है। वीडियो 20.000 सेकंड लंबा और फ्रेम-एक्यूरेट ऑडियो 20.003 सेकंड लंबा और 960144 नमूना है। वीडियो स्ट्रीम के साथ बिल्कुल मेल नहीं खाता, लेकिन यह ठीक है। केवल 144 नमूने अधिशेष हैं। सबसे बड़ी नकारात्मक बात यह है कि जब भी मैं किसी फाइल को काटना चाहता हूं, मुझे एक साधारण काम के लिए 3 कमांड भेजनी पड़ती हैं और यह दो अनावश्यक फाइल बनाता है: a_stream.webm और v_stream.webm। और selectफ़िल्टर कुछ इनपुट फ़ाइलों पर काम नहीं कर रहा है जो मैंने कोशिश की है। यह काम सफलतापूर्वक (?) करता है, लेकिन एन्कोडिंग प्रक्रिया को कभी नहीं रोकता है, इसलिए मुझे हर बार कमांड प्रॉम्प्ट को बंद करना होगा।


मैंने यह प्रश्न पोस्ट करने से पहले वह पृष्ठ पढ़ा है। उस पृष्ठ ने मेरी मदद नहीं की। यदि किसी इनपुट में परिवर्तनशील एफपीएस है तो क्या हम उस समीकरण का उपयोग करके गणना कर सकते हैं? मुझे ऐसा नहीं लगता। अब भी मुझे नहीं लगता कि '-ss' मुझे सटीक स्थिति देगा। फ्रेमवर्क फ्रेम की मांग बेहतर होगी मुझे लगता है।
Destor

ध्यान दें कि -ssफ्रेम-सटीक है ( यहां देखें )। क्या आपके पास वास्तव में चर-एफपीएस इनपुट है? मेलिंग लिस्ट थ्रेड के मेरे उत्तर लिंक में selectफिल्टर का उपयोग करने का उल्लेख है जहां आप फ्रेम नंबर निर्दिष्ट कर सकते हैं। क्या आपने कोशिश की है?
slhck

मैंने वीडियो और ऑडियो स्ट्रीम के लिए उपयोग selectऔर aselectफ़िल्टर करने का प्रयास किया है। Selectवीडियो के लिए फ्रेम-सटीक है, लेकिन aselectनमूना-सटीक नहीं है। वास्तव में यह सटीक होने से बहुत दूर है। यह साधारण -ss -toपैरामाटर्स का उपयोग करने की तुलना में बहुत अधिक खराब परिणाम देता है । उसके कारण, अब के लिए, मैं सबसे सटीक कटाई को प्राप्त करने के लिए selectफिल्टर और -ss -toमापदंडों के संयोजन का उपयोग करता हूं । लेकिन यह इसे करने के लिए एक भद्दा तरीका है। कृपया मेरी पहली पोस्ट को देखें मैंने कुछ कमांडलाइन और उनके परिणाम जोड़ दिए हैं
नष्ट करें

ffmpeg संस्करण?
फेरी

आप किसी भी तरह से एक फ्रेम संख्या में कटौती करने की कोशिश क्यों कर रहे हैं। अगर किसी को उस तरह की सटीकता की आवश्यकता है तो एविडेमक्स का उपयोग क्यों नहीं करना चाहिए? शायद आपकी मूल समस्याएं भी हैं क्योंकि यह निकटतम कुंजी फ्रेम का चयन करता है?
fie

जवाबों:


3

ऑडियो सेकंड से आता है, फ़्रेम से नहीं, इसलिए यदि आप किसी वीडियो को काटना चाहते हैं तो आपको वीडियो की गणना करना होगा एफपीएस × 20 इस तरह से: 20 सेकंड का 23.97 एफपीएस = 479.4

फ़्रेम कटिंग सटीक नहीं है क्योंकि आप अंतिम सेकंड के लिए पूर्ण एफपीएस नहीं प्राप्त कर सकते हैं, इसलिए ऑडियो अधिक सेकंड या केवल आधा सेकंड या थोड़ा अधिक या कम प्राप्त करेगा! हो सकता है कि आपको फ्रेम के बजाय सेकंड का उपयोग करना चाहिए ताकि आप सटीक कटौती कर सकें जो आप के लिए ffmpeg को बताएं। और अगर आपको 1 अतिरिक्त फ्रेम मिलता है, तो 250 वें और 750 वें फ्रेम को 250 वें और 749 वें फ्रेम में बदलने के बारे में क्या ?! माइनस 1 का उपयोग करें ताकि आप हमेशा पूछ सकें कि कितने फ्रेम हैं!


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