ffmpeg कमांड लाइन पर ffmpeg के साथ दो mp4 फाइल्स को जोड़ती है


29

मैं निम्नलिखित कमांड का उपयोग करके कई फाइलों में सफलतापूर्वक शामिल हो सकता हूं:

ffmpeg -f concat -i input.txt -codec copy output.mp4

इस आदेश के साथ एकमात्र समस्या यह है कि आपको निम्न सामग्री के साथ input.txt नामक पाठ फ़ाइल से फ़ाइलपथ पढ़ने की आवश्यकता है:

file 'C:\Users\fabio\Downloads\Super\Sharks\01.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\02.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\03.mp4'

क्या फ़ाइल से फ़ाइलपथ पढ़ने के बिना एक ही लक्ष्य प्राप्त करने का एक तरीका है? मैंने बिना किसी भाग्य के साथ कोशिश की है:

ffmpeg -f concat -i file "C:\a\b\01.mp4" file "C:\a\b\02.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b\01.mp4" "C:\a\b\02.mp4" -codec copy output.mp4

क्या मुझे एक अलग कमांड का उपयोग करना होगा?


जवाबों:


37

2019 अपडेट:

जैसा कि टिप्पणियों में उल्लेख किया गया है, स्टैक ओवरफ्लो में कॉन्फैटिनेशन के लिए उपलब्ध विकल्पों का एक बड़ा विवरण है, साथ ही इस बात की चर्चा है कि आपके द्वारा उपयोग की जाने वाली फ़ाइलों के प्रकार के आधार पर किस विधि का उपयोग करना है:

FFmpeg का उपयोग करके दो MP4 फ़ाइलों को कैसे संक्षिप्त करें?

मूल 2016 उत्तर:

आपको फ़ाइलों को संयोजित करने के लिए कॉनैट प्रोटोकॉल विधि का उपयोग करने में सक्षम होना चाहिए :

ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

इसके अलावा, FFmpeg मैनुअल MP4 फ़ाइलों के लिए विशेष रूप से एक विधि पर चर्चा करता है, ताकि उन्हें दोषरहित रूप से समाप्त किया जा सके, लेकिन इसके लिए आपको अस्थायी फ़ाइलें (या नामित पाइप) बनाने की आवश्यकता होती है:

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

1
पहले कमांड ने मेरे लिए मक्खन की तरह काम किया..इसने मेरी 6 mp4 फाइलों को आउटपुट फाइल (239 एमबी लगभग) में समेटने में 2 से 3 सेकंड का समय लिया।
सचिन

22
पहला आदेश मेरे लिए काम नहीं किया। यह सिर्फ पहली फाइल की नकल करता है।
लुइस ए। फ्लोरिट

3
यह काम नहीं करता है, यह सिर्फ पहली फ़ाइल की प्रतिलिपि बनाई है output.mp4
कांपिको

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

1
@brasofilo लिंक के लिए धन्यवाद। यह लंबे समय से अतिदेय है, लेकिन मैंने लोगों को उस दिशा में इंगित करने के लिए उत्तर को अपडेट किया।
कार्सन डार्लिंग

5

आप फ़ाइल को सूची से आउटपुट सूची के साथ बदल सकते हैं stdoutऔर stdinffmpeg से सूची को पढ़ सकते हैं :

(echo file 'a.mp4' & echo file 'b.mp4') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "result.mp4"

मैक ओएस 10.12.6 पर ffmpeg संस्करण 2.4.3-tessus का उपयोग करना, यह सिर्फ एक त्रुटि फेंकता है: "अपरिचित विकल्प 'प्रोटोकॉल_विशेषज्ञ'। Protocol_whitelist विकल्प के बिना, यह सिर्फ दूसरी MP4 फ़ाइल की एक प्रति बनाने के लिए लगता है।
जेम्स

2

नहीं, कुछ हैक के बिना एक कमांड लाइन पर ffmpeg कॉनकैट डिमॉक्सर का उपयोग करने का कोई तरीका नहीं प्रतीत होता है। आपको फ़ाइलों की सूची के साथ इनपुट टेक्स्ट फ़ाइल बनाने की आवश्यकता है। मुझे लगा कि यह खुद अजीब है, हो सकता है कि कोई इसे बाद में FFMpeg में जोड़ देगा।

इस सवाल का स्वीकृत उत्तर, कॉनसैट प्रोटोकॉल का उपयोग करता है, न कि कॉनकैट डिमॉक्सर जो ओपी ने पूछा है।


1
वास्तव में है। stdin।
Qwertiy

concat प्रोटोकॉल का उपयोग MP4 या किसी अन्य प्रारूप के साथ नहीं किया जाना चाहिए, जिसके लिए वैश्विक शीर्ष लेख की आवश्यकता होती है।
19

1

आप अभी भी कमांड को बदले बिना स्क्रिप्ट में कर सकते हैं। कुछ इस तरह:

echo "file fname1" >$$.tmp    #single redirect creates or truncates file
echo "file fname2" >>$$.tmp   # double redirect appends
echo "file fname3" >>$$.tmp   # do as many as you want.

ffmpeg -f concat -i $$.tmp -codec copy output.mp4

rm $$.tmp  # just to clean up the temp file. 
           # For debugging, I usually leave this out.

$ $ कमांड चलाने वाले शेल के पीड तक फैलता है, इसलिए हर बार जब आप इसे चलाते हैं तो फ़ाइल का नाम अलग होगा। इसलिए यदि आप चाहें तो $ $ का उपयोग कर सकते हैं। या कुछ और...

इसके अलावा, आप फ़ाइल में डेटा का एक गुच्छा जोड़ने के लिए यहां फ़ाइलों का उपयोग कर सकते हैं:

cat <<EOF >$$.tmp
file fname1
file fname2
file fname3
EOF

bash परिवर्तनीय प्रतिस्थापन कार्य करता है, इसलिए आप प्रोग्राम को फ़ाइल की सामग्री को निर्धारित कर सकते हैं, इसे ठीक करने की आवश्यकता नहीं है। मैं हर समय छोरों के लिए इस तरह के सामान को एम्बेड करता हूं। अंत में, रीडायरेक्ट ऊपर के रूप में ही काम करता है, इसलिए> $ $। tmp truncates तब लिखता है, >> $ $। tos appends।


2
सवाल पूछता है, "क्या एक फ़ाइल से फ़ाइलपथ पढ़ने के बिना एक ही लक्ष्य को प्राप्त करने का एक तरीका है?" आपने जो कुछ किया है, वह फ़ाइल को फ़ाइलपथ लिखने का एक तरीका प्रदान करता है (फ़ाइल से फ़ाइलपैथ पढ़ने के लिए)। इस सवाल का जवाब नहीं है।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.