Skip to content

TSファイル結合チュートリアル:4つのFFmpeg concat方法比較

HLSストリームをダウンロードしたが、複数のTSファイルに分割されている。ビデオが複数のTSセグメントに分割されている。これらを結合して完全なビデオにしたい。FFmpegは4つの結合方法を提供しており、それぞれに適用シナリオがあります。

TSフォーマットの基礎

TS(MPEG Transport Stream)はMPEG-2標準のコンテナフォーマットで、元はテレビ放送用に設計されました:

  • ストリーミング用設計:ネットワーク伝送に適し、途中で切断しても再開可能
  • エラー訂正: FEC(Forward Error Correction)を内蔵
  • HLSの基礎:HLSストリームは通常TSセグメントに分割
  • マルチプレクス:ビデオ、音声、字幕を同時に含む

HLSストリームでは、ビデオは2-10秒のTSセグメントに分割され、M3U8プレイリストで索引付けされます。視聴者は順次TSセグメントをダウンロードして再生します。

HLSの仕組みについて詳しくは、M3U8ファイル完全ガイド をご覧ください。

方法1:concat demuxer(推奨)

concat demuxerは最も推奨される方法で、品質ロスなく結合できます。

手順

  1. ファイルリストを作成:
text
# list.txt
file 'segment1.ts'
file 'segment2.ts'
file 'segment3.ts'
file 'segment4.ts'
  1. 結合コマンド:
bash
ffmpeg -f concat -safe 0 -i list.txt -c copy output.ts

パラメータ解説:

  • -f concat:concat demuxerを使用
  • -safe 0:ファイルパスの安全性チェックを無効化
  • -i list.txt:入力ファイルリスト
  • -c copy:ストリームを直接コピー(再エンコードなし)

MP4に出力

bash
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

TSとMP4はどちらもH.264/AACをサポートするため、通常はストリームコピーで直接変換できます。

自動リスト生成

bash
# 現在のディレクトリのすべてのTSファイルをリストに追加
for f in *.ts; do echo "file '$f'" >> list.txt; done

# 結合
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

方法2:concatプロトコル

concatプロトコルはファイルを直接連結します:

bash
# TSファイル結合
ffmpeg -i "concat:segment1.ts|segment2.ts|segment3.ts" -c copy output.ts

# MP4に出力
ffmpeg -i "concat:segment1.ts|segment2.ts|segment3.ts" -c copy output.mp4

注意: この方法はTSファイルにのみ適しています。MP4ファイルには使用できません(MP4の構造が異なるため)。concat demuxerほど柔軟ではありませんが、少数のファイルには便利です。

方法3:copyモード + 再エンコード

異なるパラメータのTSファイルを結合する場合:

bash
# 結合後に再エンコード(品質ロスあり)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4

# ビデオのみコピー、オーディオ再エンコード
ffmpeg -f concat -safe 0 -i list.txt -c:v copy -c:a aac -b:a 128k output.mp4

異なる解像度の結合

bash
# すべてのファイルを1080pに統一
ffmpeg -f concat -safe 0 -i list.txt -vf "scale=1920:1080" -c:v libx264 -crf 23 -c:a aac output.mp4

方法4:中間フォーマット使用

複雑なケースでは、中間フォーマットに変換してから結合:

bash
# 各TSファイルを中間フォーマットに変換
ffmpeg -i segment1.ts -c copy intermediate1.ts
ffmpeg -i segment2.ts -c copy intermediate2.ts

# 結合
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy output.ts

HLSストリームの結合

FFmpegで直接ダウンロード&結合

bash
# M3U8から直接MP4に変換
ffmpeg -i "https://example.com/stream.m3u8" -c copy output.mp4

# Refererヘッダー付き
ffmpeg -headers "Referer: https://example.com/" -i "https://example.com/stream.m3u8" -c copy output.mp4

# AES-128暗号化ストリーム
ffmpeg -i "https://example.com/stream.m3u8" -c copy output.mp4

FFmpegはM3U8を読み込み、全TSセグメントを順次ダウンロード、自動的に結合します。

手動ダウンロード + 結合

bash
# 1. M3U8ファイルをダウンロード
curl -o playlist.m3u8 "https://example.com/stream.m3u8"

# 2. M3U8からTS URLを抽出してダウンロード
grep -oP 'https?://[^"]+\.ts' playlist.m3u8 | while read url; do
  filename=$(basename "$url")
  curl -o "$filename" "$url"
  echo "file '$filename'" >> list.txt
done

# 3. 結合
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

当サイトのM3U8 to MP4ツールはこのプロセスを自動化しています。

よくある問題

1. 結合後に再生できない

原因: 異なるコーデックまたはパラメータ

解決策:

bash
# 各ファイルの情報を確認
ffprobe segment1.ts
ffprobe segment2.ts

# 異なる場合は再エンコード
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -crf 23 -c:a aac output.mp4

2. 音ズレ

原因: タイムスタンプの不連続

解決策:

bash
# タイムスタンプを再生成
ffmpeg -f concat -safe 0 -i list.txt -c copy -fflags +genpts output.ts

3. 結合が途中で止まる

原因: ファイルリストのパスエラー

解決策:

bash
# 絶対パスを使用
echo "file '/path/to/segment1.ts'" >> list.txt
echo "file '/path/to/segment2.ts'" >> list.txt

4. ファイルサイズが大きすぎる

原因: 再エンコードでビットレートが上がった

解決策:

bash
# ストリームコピーを使用
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

# または圧縮
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mp4

方法比較

方法品質速度柔軟性使用ケース
concat demuxer無劣化速い高い同一パラメータ(推奨)
concatプロトコル無劣化速い低い少数のTSファイル
copy + 再エンコード品質ロス遅い最高異なるパラメータ
中間フォーマット無劣化複雑なケース

まとめ

TSファイル結合の最適な方法はconcat demuxer:

bash
# 基本コマンド
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

同じコーデック、解像度、フレームレートのファイルには-c copyで無劣化結合。異なるパラメータのファイルは再エンコードが必要。

クイックリファレンス:

  • 基本コマンド: ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
  • HLS直接ダウンロード: ffmpeg -i "stream.m3u8" -c copy output.mp4
  • 無劣化結合: -c copy(同一パラメータ必須)
  • タイムスタンプ修正: -fflags +genpts

参考文献

最終更新: