* .Tf फ़ाइलों को एक एकल mp4 में संयोजित करने के लिए ffmpeg कॉपी कोडेक का उपयोग करें


47

मुझे एक एकल index.m3u8 फ़ाइल द्वारा वर्णित ts खंडों का एक गुच्छा मिला है:

index.m3u8        
segment1_0_av.ts  
segment2_0_av.ts  
segment3_0_av.ts  
segment4_0_av.ts  
segment5_0_av.ts

मुझे पता है कि वे सभी उसी तरह से एनकोडेड हैं। ffprobe मुझे निम्नलिखित देता है:

Input #0, mpegts, from 'segment1_0_av.ts':
  Duration: 00:00:10.00, start: 0.100511, bitrate: 1251 kb/s
  Program 1 
    Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 960x540 [SAR 1:1 DAR 16:9], 12.50 fps, 25 tbr, 90k tbn, 25 tbc
    Stream #0:1[0x101]: Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 105 kb/s
    Stream #0:2[0x102]: Unknown: none ([21][0][0][0] / 0x0015)

मैं उन्हें एक एकल mp4 कंटेनर में जोड़ना चाहता हूं। लेकिन जब मैं जैसे आदेश का प्रयास करता हूं:

ffmpeg -f concat -i filelist.txt -c copy output.mp4

जहां index.m3u8 फ़ाइल से filelist.txt उत्पन्न होता है, यह विभिन्न फ़ाइलों को पढ़ने में सक्षम नहीं होने के बारे में शिकायत करता है। लेकिन ts फ़ाइलों को परिवर्तित करना खुद को ठीक काम लगता है। मुझे लगता है कि मैं ठीक से ffmpeg का उपयोग नहीं कर रहा हूं।

मैं ffmpeg का उपयोग कैसे करता हूँ ts फ़ाइलों को index.m3u8 द्वारा वर्णित एकल mp4 कंटेनर में कॉपी कोडेक का उपयोग करके संयोजित करने के लिए?

जवाबों:


58

मुझे यकीन नहीं है कि क्यों ffmpeg आपको एक त्रुटि दे रहा है। हालाँकि ts उन कुछ प्रारूपों में से एक है जिन्हें बस संक्षिप्त किया जा सकता है। फिर, जब आपके पास एक एकल ts है, तो mp4 तक पहुंचाएं।

खिड़कियों के नीचे:

copy /b segment1_0_av.ts+segment2_0_av.ts+segment3_0_av.ts all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

ग्नू / लिनक्स के तहत, बैश का उपयोग करके:

cat segment1_0_av.ts segment2_0_av.ts segment3_0_av.ts > all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

12
आपको भी जरूरत पड़ सकती है -bsf:a aac_adtstoasc
कैमिलो मार्टिन

1
यह ध्यान रखना दिलचस्प है कि कमांड नहीं है ffmpeg copy ..., यह copy ...(विंडोज के तहत) है
रॉन रोइस्टन

25

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

इसके बजाय, इन फ़ाइलों को ठीक से संयोजित करने के लिए ffmpeg का उपयोग करें जैसा कि https://trac.ffmpeg.org/wiki/Concunenate में निर्देश दिया गया है । (यदि आपके पास पहले से ही https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg नहीं है, तो यहां ffmpeg स्थापित करें ।)

यदि आप मेरी पहली लिंक को पढ़ने के लिए बहुत आलसी हैं, तो आपको मूल रूप से एक .txt फाइल सूची बनानी होगी, जिसमें आप उन सभी फाइलों को सूचीबद्ध करें जिन्हें आप इस तरह संयोजित करना चाहते हैं (जो कि मेरी पहली कड़ी आपको आसानी से करने के निर्देश देती है) जहां आप हैं ' संघटन कर रहे हैं:

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

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

(for %i in (*.ts) do @echo file '%i') > mylist.txt

डबल चेक करें कि आपकी .txt फाइल अच्छी लगे और उसे सही ढंग से स्वरूपित किया जाए!

इसके बाद, कमांडलाइन रन पर:

ffmpeg -f concat -i mylist.txt -c copy all.ts

जहाँ 'mylist.txt' .txt फ़ाइल है जिसे आपने अभी बनाया है।

जांचें कि क्या परिणामी फ़ाइल सही तरीके से वीडियो चलाती है। यहां से, आप हमेशा की तरह अगर आप चाहें तो mp4 तक पहुंचा सकते हैं:

ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

यह for %i in (*.ts) doi> = 10. के लिए सही ढंग से सॉर्ट नहीं करता है। इसके अलावा, सब कुछ काम करता है, धन्यवाद। वास्तव में, समवर्ती फ़ाइल के साथ समस्याएं थीं, यह उल्लेख नहीं करने के लिए कि आपके तरीके का उपयोग करके बनाई गई फ़ाइल 16% छोटी हो गई है (मेरे पास 1400 भागों में 400kb तक)।
यूजर

नंबर के लिए @user क्रम में आप संख्याओं के माध्यम से पुनरावृत्त कर सकते हैं जैसेfor i in {1..10}; do echo file \'$i.ts\' >> list.txt ; done
qwr

8

2017 का जवाब

लेकिन जब मैं जैसे कमांड का प्रयास करता हूं ..., यह विभिन्न फ़ाइलों को पढ़ने में सक्षम नहीं होने के बारे में शिकायत करता है।

जब मैं ffmpeg -i some.ts -c copy some.mp4एक निश्चित वीडियो पर अमल करता हूं, मुझे यह त्रुटि संदेश मिलता है:

Malformed AAC bitstream detected: use the audio bitstream filter 
'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)

av_interleaved_write_frame(): Operation not permitted

आश्चर्य की बात नहीं, निष्पादन ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4इसे ठीक करता है।


3
एक नया पर्याप्त प्राप्त करें ffmpegऔर यह अब स्वचालित रूप से ऐसा करेगा।
ललगन

7

सभी को एक साथ रखना

जुआन एक्विनो के उत्तर का उपयोग करना (और बैश के साथ संगत होने और फ़ाइलों के प्राकृतिक क्रम का उपयोग करने के लिए पहली कमांड को सही करना), साथ ही 7vujy0f0hy का जवाब, लिनक्स बैश शेल के लिए एक सरल कार्य स्क्रिप्ट है:

#!/bin/bash
for i in `ls *.ts | sort -V`; do echo "file $i"; done >> mylist.txt
ffmpeg -f concat -i mylist.txt -c copy -bsf:a aac_adtstoasc video.mp4

4

M3u8 प्लेलिस्ट से कई वीडियो फ़ाइलों को संक्षिप्त करने का सही तरीका है

ffmpeg -i "index.m3u8" -codec copy output.mp4


  • m3u8 प्लेलिस्ट वेब या स्थानीय रूप से निर्देशिका में हो सकती है
    • इसमें प्लेलिस्ट के सापेक्ष फ़ाइल पथों की सूची है
  • -codec copy एन्कोडिंग से बचने के लिए
  • कंटेनर प्रकार मायने रखता है:
    • *.mp4 ठीक है, लेकिन यह धीमा लगता है जब वेब से प्लेलिस्ट प्राप्त की जाती है
    • *.mkvया *.tsमेरे लिए सबसे अच्छा काम किया

2

आप कॉन्टेक्टिंग को साधारण जैसे (बैश के साथ) कर सकते हैं:

for f in ./{0..<number>}.ts; do cat $f >> out.ts; done

<number>उच्चतम संख्या (स्पष्ट रूप से) के साथ बदलें । Ffmpeg वाले वेरिएंट ठीक से काम नहीं करते हैं। आउटपुट वीडियो फ़ाइल अजीब तरह से हकलाना होगा।

मैं फ़ाइलों के सही क्रम को सुनिश्चित करने के लिए लूप के लिए उपयोग करता हूं। शायद आपको इसकी आवश्यकता न हो। शायद यह ffmpeg के आउटपुट को पाइप करने के लिए और इसे मक्खी पर mp4 में बदलने के लिए भी संभव है।



0

इस सवाल के सभी लोकप्रिय जवाब जो पाठकों को गुमराह करते हैं कि ffmpeg चलाने से पहले TS फ़ाइलों को संक्षिप्त करना गलत है। यह सुनिश्चित करने के लिए कि ऑडियो और वीडियो mp4 स्ट्रीम की असेंबली के दौरान सिंक से बाहर न हों, खराब रूप से प्रलेखित लेकिन महत्वपूर्ण "-f concat" फ़ीचर की ffmpeg का उपयोग किया जाना चाहिए।

    delimiterBeforeFileNumber="-"
    ls |egrep '[.]ts$' \
        |sort "-t$delimiterBeforeFileNumber" -k2,2n \
        |sed -r "s/(.*)/file '\1'/" >ts.files.txt

    ffmpeg -f concat -i ts.files.txt -c copy tsw.014.ts.mp4

कोड की दो प्रारंभिक रेखाएं इस लाइन प्रारूप में TS फ़ाइलों की सूची वाली एक फ़ाइल बनाती हैं:

    file 'seg-37-a.ts'

दरअसल, जब मैंने यह कोशिश की, तो अंतिम वीडियो में खंडों के बीच थोड़ा "हकलाना" था। तो कम से कम उस एक मामले में पहले टीएस फाइलों को संक्षिप्त करने में मदद मिली।
स्फिंक्सक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.