web-dev-qa-db-ja.com

ffmpegコピーコーデックを使用して* .tsファイルを単一のmp4にまとめる

私は単一の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コンテナにまとめるにはどうすればよいですか?

39
Ana

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
53
szatmary

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
21
Juan Aquino

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を実行すると修正されます。

6
7vujy0f0hy

まとめて

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
4

M3u8プレイリストから複数のビデオファイルを連結する正しい方法は次のとおりです。

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


  • m3u8プレイリストは、ウェブ上またはローカルのディレクトリに配置できます。
    • それはプレイリストに関連するファイルパスのリストを含みます
  • エンコードを避けるための-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に変換することも可能です。

2
ragnarsson

これらの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

0
Kris Roofe

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'
0
Douglas Daseeco