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?
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
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
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
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.
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
-
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.
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
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'
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