私は単一の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)
それらを1つのmp4コンテナにまとめたいのですが。しかし、私が以下のようなコマンドを試すと:
ffmpeg -f concat -i filelist.txt -c copy output.mp4
index.m3u8ファイルからfilelist.txtを生成したところ、さまざまなファイルを読み取れないことについて不平を言っています。しかし、tsファイル自体の変換はうまく機能するようです。私はffmpegを正しく使っていないと思います。
Ffmpegを使ってindex.m3u8で記述されたtsファイルをコピーコーデックを使って単一のmp4コンテナにまとめるにはどうすればよいですか?
Ffmpegがあなたにエラーを出している理由はよくわかりません。しかしtsは単純に連結できる数少ないフォーマットの1つです。それで、あなたがひとたびtsを持っていたら、mp4にtransmuxしてください。
窓の下:
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
GNU/Linuxでは、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
Szatmaryの現在のトップアンサーのようにcopyまたはcatを使用してファイルを結合すると、限界をはるかに超えて再生され、再生の問題と一緒に検索できないファイルが残ることがあります。
代わりに、これらのファイルを適切に結合するには、 https://trac.ffmpeg.org/wiki/Concatenate で説明されているようにffmpegを使用してください。 (まだ持っていない場合は、ここにffmpegをインストールしてください https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg 。)
最初のリンクを読むのが面倒な場合は、基本的に、結合したいすべてのファイルをリストした.txtファイルを作成する必要があります(最初のリンクには、その方法について説明があります)。連結をやり直す:
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
たとえば、コマンドラインでWindowsを使用している場合、テキストファイルを作成するための1つの方法として、最初のリンクからのコピーペーストを次に示します。ただし、明らかに手動でファイルを作成することもできます。
(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にtransmuxすることができます:
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
しかし、私が
...
のようなコマンドを試すとき、それは様々なファイルを読むことができないことについて不平を言います。
特定のビデオで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
を実行すると修正されます。
まとめて
Juan Aquinoの答え(およびBashと互換性があるように最初のコマンドを修正し、ファイルの自然な順序を使用する)、および7vujy0f0hyの答えを使用して、Linux Bashシェル用の簡単な作業スクリプトは次のとおりです。
#!/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
M3u8プレイリストから複数のビデオファイルを連結する正しい方法は次のとおりです。
ffmpeg -i "index.m3u8" -codec copy output.mp4
-codec copy
*.mp4
は問題ありませんが、再生リストがウェブから取得されるとき、muxには少し遅いようです*.mkv
または*.ts
が私に最適でしたあなたは(bashを使って)soのように単純な連結をすることができます:
for f in ./{0..<number>}.ts; do cat $f >> out.ts; done
<number>
を最も大きい数字に置き換えます(明らかに)。 ffmpegの亜種は正しく動作しませんでした。出力ビデオファイルが奇妙に途切れます。
ファイルの正しい順序を保証するためにforループを使用します。たぶんあなたはそれを必要としないでしょう。おそらく、出力をffmpegにパイプで転送して、その場でmp4に変換することも可能です。
これらのtsファイルをffmpegにパイプする を使用して、mp4ファイルを出力できます。
cat *.ts | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4
または、ファイル名に順序がない場合は、
grep .*.ts index.m3u8 | xargs cat | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4
Ffmpegを実行する前にTSファイルを連結するように読者に誤解させるというこの質問に対する一般的な回答はすべて間違っています。 mp4ストリームのアセンブリ中にオーディオとビデオが同期しなくならないように、ffmpegの文書化されていないが重要な "-f concat"機能を使用する必要があります。
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
2つの準備コード行は、以下の行フォーマットでTSファイルのリストを含むファイルを作成するだけです。
file 'seg-37-a.ts'