कैसे ffmpeg के साथ एक ही वीडियो से क्लिप को बदलना है


15

मेरे पास अलग-अलग दृश्यों के साथ एक लंबा वीडियो है। मैं ffmpeg 2.1.4 का उपयोग करके वीडियो से 2 दृश्यों को निकालना चाहता हूं (जो कि एक I- फ्रेम पर शुरू नहीं होता है)।

तर्क के लिए, मुझे 01:00 और 02:00 से 5 सेकंड चाहिए।

मे यह कर सकती हु:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

इससे मुझे वह फिल्म मिलती है जो मैं चाहता हूं, लेकिन वास्तव में फिल्म के बाकी हिस्सों को डिकोड करने के लिए ffmpeg का चयन करता है। तो, मैं इसे डिकोड करने के बजाय पहली फिल्म को कैसे छोटा करूं?

यदि संभव हो तो मैं एक ffmpeg जटिल फिल्टर के साथ ऐसा करना पसंद करूंगा। मुझे पता है कि मैं -tपहले अलग-अलग फिल्मों को फिर से उपयोग करने के लिए उपयोग कर सकता हूं , लेकिन मेरे मामले में अतिरिक्त एन्कोडिंग कदम बहुत धीमा है और इस वीडियो के लिए उचित मात्रा में गुणवत्ता भी खो देता है।

मुझे ऐसा कोई फ़िल्टर नहीं मिल रहा है जो भाप की लंबाई को कम करता हो। क्या फ़िल्टर नोड्स हैं जो -tया -ssमापदंडों के अनुरूप हैं ?

जवाबों:


16

अवतल फिल्टर

यदि आपको अतिरिक्त फ़िल्टरिंग करने की आवश्यकता है तो यह विधि सर्वोत्तम है:

का प्रयोग करें trim, atrim, setpts, asetpts, और concatफिल्टर:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptsऔर asetptsप्रस्तुति टाइमस्टैम्प मुद्दों के कारण झटकेदार आउटपुट को रोक देगा।

  • हाल के संस्करण का उपयोग करना सुनिश्चित करें। विंडोज, ओएस एक्स और लिनक्स के निर्माण के लिंक के लिए FFmpeg डाउनलोड पेज देखें ।


अवगत करनेवाला

एक और तरीका यह है कि खंडों को अलग-अलग बनाया जाए और पुन: एन्कोडिंग (समय और गुणवत्ता बचाने के लिए) के बजाय उन्हें कॉपी किया जाए, और उन्हें कॉनकैट डिमॉक्सर के साथ जोड़ा जाए

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
आह, धन्यवाद। ट्रिम मैं क्या याद कर रहा था। हालाँकि, मेरे द्वारा निर्दिष्ट समय ऑफसेट को प्राप्त करने में बहुत लंबा समय लगता है, जैसे कि सब कुछ को डिकोड करना। साथ ही, आउटपुट का हिस्सा ऑडियो गायब था। फिक्स करने के लिए, मैंने एक ही इनपुट को -ss के साथ कई बार निर्दिष्ट किया, फिर वीडियो को छोटा करने के लिए ट्रिम का उपयोग करें। आपको उस स्थिति में सेटिस्फेक्शन की आवश्यकता नहीं है, क्योंकि ss pts को 0. पर सेट करता है। यह काम करने के लिए लग रहा था और एन्कोडिंग के दौरान अजीब यादृच्छिक ठहराव नहीं था। जैसा कि धाराओं की नकल करने के लिए, मैंने पहले भी कोशिश की थी। यह पिछले आई-फ्रेम पर शुरू होता है, इसलिए आपको फिल्म का एक अलग हिस्सा मिलता है, जो आप चाहते थे।
18'14

क्या आप कृपया मेरे प्रश्न का उत्तर देंगे यह इसी के समान है। video.stackexchange.com/questions/18247/...
Eftekhari

दिलचस्प है कि -filter_complexकाम करता है, लेकिन concatफ़ाइलें नहीं है - यानी 1 वीडियो ठीक लग रहा है, लेकिन 2 की गुणवत्ता भयानक है। ध्यान दें, मैंने इन आदेशों को बिल्कुल दोनों के लिए कॉपी किया (इनपुट फ़ाइल को छोड़कर)।
bobmarksie

7

यह तेजी से काम करना चाहिए ...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

आउटपुट पर -t निर्दिष्ट करने की कोई आवश्यकता नहीं है। कॉनसैट से पहले ऑडियो और वीडियो को विभाजित करने की कोई आवश्यकता नहीं है।


1
यह कॉनसेट फ़िल्टर का उपयोग करता है जिसके लिए पुन: एन्कोडिंग की आवश्यकता होगी। यह उपयोगकर्ता द्वारा वांछित हो भी सकता है और नहीं भी।
ल्लगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.