Verwenden Sie ffmpeg copy Codec zu kombinieren *.ts-Dateien in einem einzigen mp4

Ich habe eine Reihe von ts-Segmenten, die durch einen einzelnen Index beschrieben werden.m3u8 Datei:

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

Ich weiß, dass sie alle auf die gleiche Weise codiert sind. ffprobe gibt mir Folgendes:

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)

Ich möchte sie zu einem einzigen MP4-Container kombinieren. Aber wenn ich Befehle versuche wie:

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

Wobei die Dateiliste generiert wird.txt aus dem index.m3u8-Datei beschwert es sich darüber, dass verschiedene Dateien nicht gelesen werden können. Das Konvertieren der TS-Dateien selbst scheint jedoch einwandfrei zu funktionieren. Ich denke ich bin ffmpeg nicht richtig verwenden.

Wie verwende ich ffmpeg, um die von index beschriebenen TS-Dateien zu kombinieren?m3u8 in einem einzigen MP4-Container mit dem Copy-Codec?

Author: Ana, 2013-12-25

8 answers

Ich bin mir nicht sicher, warum ffmpeg Ihnen einen Fehler gibt. ts ist jedoch eines der wenigen Formate, die einfach verkettet werden können. Dann, sobald Sie einen einzigen ts haben, transmux zu mp4.

Unter windows:

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

Unter GNU / Linux mit bash:

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
 74
Author: szatmary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-12-19 17:08:34

Wenn Sie copy oder cat verwenden, um die Dateien wie szatmarys aktuelle Top-Antwort zu kombinieren, erhalten Sie möglicherweise eine Datei, die weit über das Limit hinaus abgespielt wird und nicht zusammen mit Wiedergabeproblemen suchen kann.

Um diese Dateien richtig zu kombinieren, verwenden Sie stattdessen ffmpeg wie in https://trac.ffmpeg.org/wiki/Concatenate. (Installieren Sie ffmpeg hier, wenn Sie es noch nicht haben https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg.)

Wenn du zu faul bist zu Lesen mein erstes link, Sie müssen im Grunde ein erstellen .txt-Datei, die alle Dateien auflistet, die Sie so kombinieren möchten (was mein erster Link Anweisungen dazu gibt), in dem Ordner, in dem Sie die Verkettung durchführen:

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

Hier ist eine Copy Paste von meinem ersten Link auf eine Möglichkeit, eine Textdatei zu erstellen, wenn Sie beispielsweise Windows in der Befehlszeile haben, aber offensichtlich können Sie die Datei manuell erstellen oder wie Sie möchten:

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

Überprüfen Sie, dass Ihre .txt-Datei sieht gut aus und ist formatiert richtig!

Danach auf Kommandozeile ausführen:

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

, Wo 'mylist.txt' ist .txt-Datei, die Sie gerade gemacht haben.

Überprüfen Sie, ob die resultierende Datei das Video korrekt wiedergibt. Von hier aus können Sie wie gewohnt in mp4 umwandeln, wenn Sie möchten:

ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
 37
Author: Juan Aquino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-05-04 14:24:34

Alle zusammensetzen

Mit der Antwort von Juan Aquino (und der Korrektur des ersten Befehls, der mit Bash kompatibel ist, und der natürlichen Reihenfolge der Dateien) sowie der Antwort von 7vujy0f0hy ist ein einfaches Arbeitsskript für eine Linux-Bash-Shell:

#!/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
 9
Author: Francesco Galgani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-11-11 10:10:35

2017 Antwort -

Aber wenn ich Befehle wie ... versuche, beschwert es sich darüber, dass es nicht in der Lage ist um verschiedene Dateien zu lesen.

Wenn ich ffmpeg -i some.ts -c copy some.mp4 für ein bestimmtes Video ausführe, wird folgende Fehlermeldung angezeigt:

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

Es überrascht nicht, dass die Ausführung von ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4 dies behebt.

 8
Author: 7vujy0f0hy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-25 22:44:08

Die richtige Methode zum Verketten mehrerer Videodateien aus der m3u8-Wiedergabeliste ist

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


  • die m3u8 Playlist kann im Web oder lokal im Verzeichnis sein
    • es enthält eine Liste von Dateipfaden relativ zur Wiedergabeliste
  • -codec copy um eine Kodierung zu vermeiden
  • Containertyp ist wichtig:
    • *.mp4 ist in Ordnung, aber es scheint wenig langsam zu mux, wenn Playlist aus dem Web abgerufen wird
    • *.mkv oder *.ts funktionierte am besten für me
 7
Author: Vlastimil Ovčáčík,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-11-14 20:18:17

Sie können das Verketten einfach so machen (mit bash):

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

Ersetze <number> durch die höchste Zahl (offensichtlich). Die Varianten mit ffmpeg funktionierten nicht richtig. Die Ausgabevideodatei würde seltsam stottern.

Ich verwende die for-Schleife, um die korrekte Reihenfolge der Dateien. Vielleicht brauchst du es nicht. Vielleicht ist es sogar möglich, die Ausgabe an ffmpeg weiterzuleiten und sie im laufenden Betrieb in MP4 zu konvertieren.

 2
Author: ragnarsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-05 19:00:03

Sie können diese TS-Dateien mit in ffmpeg und die MP4-Datei ausgeben.

cat *.ts | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4

Oder Wenn Sie ts Dateiname nicht Ordnung haben,

grep .*.ts index.m3u8 | xargs cat | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4

 1
Author: LF00,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-08-06 01:13:32

Alle gängigen Antworten auf diese Frage, die Leser dazu verleiten, die TS-Dateien vor dem Ausführen von ffmpeg zu verketten, sind falsch. Um sicherzustellen, dass Audio und Video während der Zusammenstellung des MP4-Streams nicht nicht synchron sind, sollte die schlecht dokumentierte, aber wichtige "- f concat" - Funktion von ffmpeg verwendet werden.

    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

Die beiden vorbereitenden Codezeilen erstellen einfach eine Datei mit einer Liste von TS-Dateien in diesem Zeilenformat:

    file 'seg-37-a.ts'
 0
Author: Douglas Daseeco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-11-23 07:35:42