コマンドライン – ffmpegコピーコーデックを使って*.tsファイルを1つのmp4に結合する

codec command-line ffmpeg mp4 video-conversion

1つの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をちゃんと使っていないような気がします

index.m3u8で記述されたtsファイルをコピーコーデックを使用して1つのmp4コンテナに結合するためにffmpegを使用するにはどうすればいいですか?

  56  Ana  2013-12-25


ベストアンサー

なぜ ffmpeg がエラーを出しているのかわかりません。しかし、tsは単純に連結できる数少ないフォーマットの一つです。そして、あなたが一度、単一のtsを持っているならば、mp4に変換します

Under 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

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

67  szatmary  2013-12-25


szatmaryの現在のトップアンサーのようなファイルを結合するためにコピーまたは猫を使用すると、限界をはるかに超えて再生し、再生の問題と一緒にシークすることはできませんファイルを残すかもしれません

代わりに、https://trac.ffmpeg.org/wiki/Concatenate で指示されているように、これらのファイルを適切に結合するには ffmpeg を使用してください。(https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg で指示されているように ffmpeg をインストールしてください。)

私の最初のリンクを読むにはあまりにも怠け者なので、基本的には、結合したいすべてのファイルをリストアップした.txtファイルを、結合を行っているフォルダに作成する必要があります

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

ここでは、例えばコマンドラインでWindowsを使用している場合にテキストファイルを作成する方法についての私の最初のリンクからのコピーペーストですが、明らかに手動で作成することもできますし、あなたが望む方法で作成することもできます

(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

35  Juan Aquino  2017-01-01


2017 answer

しかし、...のようなコマンドを試してみると、いろいろなファイルが読めないと文句を言ってきます

ある動画で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を実行すると修正されます

8  7vujy0f0hy  2017-03-25


全部まとめて

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

8  Francesco Galgani  2017-11-11


m3u8プレイリストから複数の動画ファイルをコンカッションするのが正しい方法です

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


  • m3u8のプレイリストは、ウェブ上またはディレクトリ内のローカルにあることができます
    • プレイリストからの相対的なファイルパスのリストを含みます
  • -codec copyでエンコードを回避する
  • コンテナの種類の問題:
    • *.mp4は問題ありませんが、Webからプレイリストを取得したときのmuxが少し遅いように感じます
    • *.mkv*.tsが一番効きました

7  Vlastimil Ovčáčík  2018-11-14


このように簡単に連結することができます(bashで)

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

<number>を一番高い数字に置き換えてください(当たり前ですが)。ffmpeg を使ったバリアントは正しく動作しませんでした。出力されたビデオファイルは奇妙なほど吃ります

順番を間違えないようにforループを使っています。たぶん必要ないと思います。もしかしたら、出力をffmpegにパイプして、その場でmp4に変換することも可能かもしれません

2  ragnarsson  2018-01-05


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

1  Kris Roofe  2019-08-06


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  2018-11-23


タイトルとURLをコピーしました