मापदंडों का उपयोग करने -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
फ़िल्टर कुछ इनपुट फ़ाइलों पर काम नहीं कर रहा है जो मैंने कोशिश की है। यह काम सफलतापूर्वक (?) करता है, लेकिन एन्कोडिंग प्रक्रिया को कभी नहीं रोकता है, इसलिए मुझे हर बार कमांड प्रॉम्प्ट को बंद करना होगा।
select
और aselect
फ़िल्टर करने का प्रयास किया है। Select
वीडियो के लिए फ्रेम-सटीक है, लेकिन aselect
नमूना-सटीक नहीं है। वास्तव में यह सटीक होने से बहुत दूर है। यह साधारण -ss
-to
पैरामाटर्स का उपयोग करने की तुलना में बहुत अधिक खराब परिणाम देता है । उसके कारण, अब के लिए, मैं सबसे सटीक कटाई को प्राप्त करने के लिए select
फिल्टर और -ss
-to
मापदंडों के संयोजन का उपयोग करता हूं । लेकिन यह इसे करने के लिए एक भद्दा तरीका है। कृपया मेरी पहली पोस्ट को देखें मैंने कुछ कमांडलाइन और उनके परिणाम जोड़ दिए हैं