FFmpeg वीडियो को विभाजित करके वापस मर्ज कर देता है


7

मैं कुछ start_timeऔर end_timeइनपुट के आधार पर वीडियो को विभाजित करने के लिए FFmpeg का उपयोग करने की कोशिश कर रहा हूं , और अन्य वीडियो फ़ाइलों के साथ उन लोगों को प्रतिस्थापित कर रहा हूं । उदाहरण के लिए, इनपुट के लिए 10 15मुझे EXACT सेकंड 10 to 15को दूसरे वीडियो से बदलना होगा ।

ठीक। मेरे मन में क्या आता है:

  1. पहले वीडियो को विभाजित करें (इस मामले में, 0-10, 10-15 और 15-अंत)
  2. अन्य वीडियो के साथ 10-15 बदलें
  3. सभी उप-वीडियो वापस मर्ज करें

पहला सवाल: क्या यह सबसे अच्छा और सबसे तेज़ समाधान है? क्या हमारे पास किसी अन्य वीडियो के साथ वीडियो की विशिष्ट अवधि को बदलने के लिए एक आसान कमांड या अन्य उपकरण हैं?

दूसरा प्रश्न: FFmpeg को मान लेना एक व्यवहार्य समाधान है, जब मैं केवल कमांड का उपयोग करता ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4हूं, तो मेरा वीडियो प्रोसेसिंग कोड फ़ाइल को पढ़ और प्रोसेस नहीं कर सकता है। मैंने mediainfoदो फ़ाइलों की तुलना करने के लिए टूल का उपयोग किया और हेडर के आकारों में अंतर देखा, जबकि सभी वीडियो कोडेक संबंधित सामान समान थे। मैंने देखा कि सिर आकार अलग है जो स्पष्ट रूप से समस्या का कारण है। क्या हेडर के आकार को भी (कोडेक्स से अलग) बल देने का कोई तरीका है?

अद्यतन: यहाँ मूल .mp4फ़ाइल है जो एमुलेटर में ठीक काम करती है।


पहले हमें आपके दूसरे प्रश्न में आपके द्वारा बताई गई समस्या से निपटना होगा। कृपया सटीक कमांड दिखा रहे हैं जिसका आप उपयोग कर रहे हैं और फुल, अनकैप कमांड लाइन आउटपुट जो आपको ffmpeg से मिलता है। फ़ाइल को पढ़ते समय आपको जो भी वास्तविक त्रुटियां मिलती हैं, उन्हें दिखाएं - यह जानना अच्छा होगा कि आपका "प्रोसेसिंग कोड" क्या है।
slhck

@slhck वीडियो प्रोसेसिंग कोड एक विशाल कोड बेस है। मैं इसे साझा नहीं कर सकता। यह सिर्फ इतना है कि कुछ कारणों से मूल फ़ाइल को पढ़ा जाता है, लेकिन फिर से उत्पन्न नहीं होता है। फिर भी .mp4यदि आवश्यक हो तो मैं मूल फ़ाइल साझा कर सकता हूं ।
एरियाना

मैंने दो फाइलों की तुलना करने के लिए और हेडर के आकार और सामान में अंतर की सूचना के लिए मीडिएंफो टूल का इस्तेमाल किया
एरियाना

मूल होने से मदद मिलेगी, लेकिन हम इसका निवारण नहीं कर पाएंगे कि इसे क्यों नहीं पढ़ा जा सकता, मुझे डर है, अगर यह कुछ आंतरिक कोड है।
जूल

@slhck मैंने फ़ाइल अपलोड की। मेरा प्रश्न अद्यतन है
एरियाना

जवाबों:


7

विभिन्न कोडेक्स के साथ स्रोत फ़ाइलों का उपयोग करना trimऔरconcat

इसके लिए, सुनिश्चित करें कि आपकी व्यक्तिगत फ़ाइलों में एक ही रिज़ॉल्यूशन है, और आदर्श रूप से समान फ़्रैमरेट और क्रोमा सबसैंपलिंग आदि। यह कॉन्टेक्टेशन के दौरान त्रुटियों या ग्लिट्स को रोक देगा।

आप फ़ाइल trimऔर विभाजन का उपयोग किए बिना सब कुछ एक ही बार में कर सकते हैं concat:

ffmpeg -i edv_g24.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4

यहां, trimइनपुट वीडियो स्ट्रीम ( 0:v, 1:v) के व्यक्तिगत भागों को निर्दिष्ट करने के लिए उपयोग किया जाता है जिसे आप बाद में संक्षिप्त करना चाहते हैं। इन भागों के v0माध्यम से नाम दिया गया है v2। ( setptsफ़िल्टर इन व्यक्तिगत भागों के टाइमस्टैम्प्स को 0 पर रीसेट करता है, जो कि सहमति के लिए आवश्यक है)। बाद में, हम तीन भागों को समेटते हैं।

यदि आप एक निश्चित टाइमस्टैम्प से अंत तक ट्रिम करना चाहते हैं, trim=start=15तो रेंज निर्दिष्ट करने के बजाय उपयोग करें ।

यदि आपकी फ़ाइलों में ऑडियो हैं, तो आपको उन धाराओं को अलग से ट्रिम करना होगा:

ffmpeg -i edv_g24_2.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[1:a]atrim=0:5,asetpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=15:30,asetpts=PTS-STARTPTS[a2]; \
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4

ध्यान दें कि इस मामले में वीडियो और ऑडियो को फिर से एनकोड किया जाएगा - उचित आउटपुट गुणवत्ता लक्ष्य (जैसे -crfx264, x265 या libvpx-vp9 के लिए) निर्दिष्ट करना सुनिश्चित करें । आप इसके बारे में FFmpeg Wiki, जैसे VP9 या H.264 पर पढ़ सकते हैं ।

व्यक्तिगत खंडों का उपयोग करना

यदि आप क्लिप को विभाजित करना चाहते हैं और बाद में उन्हें फिर से इकट्ठा करते हैं:

ffmpeg -i edv_g24.mp4 -ss 0 -to 10 -c copy part1.mp4
ffmpeg -i edv_g24.mp4 -ss 10 -to 15 -c copy part2.mp4
ffmpeg -i edv_g24.mp4 -ss 15 -c copy part3.mp4

ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" \
-map "[outv]" -t 30 output.mp4

यदि फ़ाइलों में ऑडियो है, तो ऊपर दिए गए समान दृष्टिकोण का उपयोग करें:

ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -t 30 output.mp4

यह फिर से वीडियो स्ट्रीम को फिर से एनकोड करेगा। यह थोड़ा अधिक सीधा है, लेकिन अन्यथा उपरोक्त विधि के बराबर होना चाहिए।

concatडिमूक्सर का उपयोग करना

आप सिद्धांत रूप में भी कंसट्रक्शन को फिर से एनकोड करने के लिए कंसट्रेट डिमॉक्सर का उपयोग करके उन्हें पुन: एन्कोडिंग करने का प्रयास कर सकते हैं। नामक एक फ़ाइल बनाएँ concat.txtऔर निम्नलिखित प्रविष्टियाँ जोड़ें (ऊपर बनाई गई वीडियो क्लिप के अनुसार):

file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'

फिर इन व्यक्तिगत फ़ाइलों को संक्षिप्त करें:

ffmpeg -f concat -i concat.txt -c copy output.avi

हालाँकि इसके लिए आपके क्लिप को समान कोडेक, रिज़ॉल्यूशन, फ्रैमरेट आदि की आवश्यकता होती है - इसलिए यह सभी प्रकार के विषम स्रोतों के साथ काम नहीं करता है।

concatप्रोटोकॉल का उपयोग करना

उपरोक्त प्रकार के फ़ाइल-स्तर के संयोजन को concatप्रोटोकॉल का उपयोग करके प्राप्त किया जा सकता है , ऊपर (समान कोडेक, संकल्प, आदि) के समान बाधाओं के साथ:

ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4

संघटन के बारे में अधिक जानकारी के लिए, संबंधित FFmpeg Wiki पृष्ठ पढ़ें ।


यह बहुत पूरा लग रहा है! धन्यवाद। मैं उन्हें कोशिश करूँगा!
एरियाना

Idk क्यों concatविधि का उपयोग कर एक त्रुटि फेंकता है:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
एरियाना

"व्यक्तिगत खंडों का उपयोग करने" के लिए, मैं आउटपुट को रोक और छोटा करता हूं। क्या इसे ठीक करने का कोई तरीका है?
एरियाना

विधि 1 पूरी तरह से काम करता है। एक बात: हम एक विशिष्ट संख्या (30 एस के बजाय) के बिना "अंत तक" कैसे निर्दिष्ट कर सकते हैं
एरियाना

1
क्षमा करें, गलती हुई। के लिए concatdemuxer, वाक्य रचना अलग था। अब तय हो गया। अंत तक जाने के लिए, उपयोग करें trim=start=15, ट्रिम फ़िल्टर प्रलेखन देखें: ffmpeg.org/ffmpeg-filters.html#trim - समय के मुद्दों के लिए, यह वास्तव में आपके स्रोत सामग्री पर निर्भर करता है। हालांकि आपके द्वारा अपलोड की गई क्लिप के साथ समसामयिक मुद्दे नहीं थे।
slhck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.