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は最も推奨される方法で、品質ロスなく結合できます。
手順
- ファイルリストを作成:
# list.txt
file 'segment1.ts'
file 'segment2.ts'
file 'segment3.ts'
file 'segment4.ts'- 結合コマンド:
ffmpeg -f concat -safe 0 -i list.txt -c copy output.tsパラメータ解説:
-f concat:concat demuxerを使用-safe 0:ファイルパスの安全性チェックを無効化-i list.txt:入力ファイルリスト-c copy:ストリームを直接コピー(再エンコードなし)
MP4に出力
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4TSとMP4はどちらもH.264/AACをサポートするため、通常はストリームコピーで直接変換できます。
自動リスト生成
# 現在のディレクトリのすべての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プロトコルはファイルを直接連結します:
# 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ファイルを結合する場合:
# 結合後に再エンコード(品質ロスあり)
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異なる解像度の結合
# すべてのファイルを1080pに統一
ffmpeg -f concat -safe 0 -i list.txt -vf "scale=1920:1080" -c:v libx264 -crf 23 -c:a aac output.mp4方法4:中間フォーマット使用
複雑なケースでは、中間フォーマットに変換してから結合:
# 各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.tsHLSストリームの結合
FFmpegで直接ダウンロード&結合
# 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.mp4FFmpegはM3U8を読み込み、全TSセグメントを順次ダウンロード、自動的に結合します。
手動ダウンロード + 結合
# 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. 結合後に再生できない
原因: 異なるコーデックまたはパラメータ
解決策:
# 各ファイルの情報を確認
ffprobe segment1.ts
ffprobe segment2.ts
# 異なる場合は再エンコード
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -crf 23 -c:a aac output.mp42. 音ズレ
原因: タイムスタンプの不連続
解決策:
# タイムスタンプを再生成
ffmpeg -f concat -safe 0 -i list.txt -c copy -fflags +genpts output.ts3. 結合が途中で止まる
原因: ファイルリストのパスエラー
解決策:
# 絶対パスを使用
echo "file '/path/to/segment1.ts'" >> list.txt
echo "file '/path/to/segment2.ts'" >> list.txt4. ファイルサイズが大きすぎる
原因: 再エンコードでビットレートが上がった
解決策:
# ストリームコピーを使用
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:
# 基本コマンド
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