ffmpeg copy codecを使用して* .tsファイルを単一のmp4に結合します


47

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

回答:


58

ffmpegがエラーを表示する理由がわかりません。ただし、tsは単純に連結できる数少ない形式の1つです。次に、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

12
必要かもしれません-bsf:a aac_adtstoasc
カミロマーティン

1
コマンドではないことに注意することは興味深いffmpeg copy ...、それはcopy ...(Windows環境下)
ロン・ロイストン

25

copyまたはcatを使用してszatmaryの現在のトップアンサーのようなファイルを結合すると、制限をはるかに超えて再生され、再生の問題とともにシークできないファイルが残る場合があります。

代わりに、これらのファイルを適切に結合するには、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にトランスマックスできます:

ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4

それはfor %i in (*.ts) doそれとは別にI> = 10、すべての作品を、感謝のソートが正しくありません。実際、連結ファイルには問題がありましたが、メソッドを使用して作成されたファイルが16%小さくなっていることは言うまでもありません(400kbで1400個のパーツがありました)。
ユーザー

次のような数値を反復処理できるようにするための数値の@userfor i in {1..10}; do echo file \'$i.ts\' >> list.txt ; done
qwr

8

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


3
十分に新しいものを入手するffmpegと、自動的にこれが行われます。
llogan

7

すべてをまとめる

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プレイリストは、Web上またはディレクトリ内のローカルに配置できます
    • プレイリストに相対的なファイルパスのリストが含まれています
  • -codec copy エンコードを避けるために
  • コンテナの種類が重要です:
    • *.mp4 うまくいきますが、プレイリストがWebから取得されると、muxが少し遅くなるようです。
    • *.mkvまたは*.ts私のために最高に働きました

2

そのように単純な連結を行うことができます(bashを使用):

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

交換 <number>(明らかに)最も大きい数字にます。ffmpegを使用したバリアントは適切に機能しませんでした。出力ビデオファイルは奇妙に途切れます。

forループを使用して、ファイルの正しい順序を確認します。たぶん、あなたはそれを必要としません。出力をffmpegにパイプして、その場でmp4に変換することも可能かもしれません。



0

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'

実際、これを試したとき、最終ビデオのセグメント間にわずかな「スタッター」がありました。そのため、少なくとも1つのケースでは、TSファイルを最初に連結するのに役立ちました。
Sphinxxx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.