TVTest・EDCB・PT3で録画した .ts ファイルや、Blu-rayから取り出した .m2ts は、そのままでは編集ソフトやスマホで扱いにくい形式です。FFmpegを使えば、再エンコードせずに(画質を落とさずに)MP4にできます。処理は数秒〜数十秒で終わります。
注意: 自分で見るための録画だけに使い、番組の配布や再アップロードは著作権法の観点から行わないでください。
1. TS / m2ts / BDAV の違い
| 形式 | 主な用途 | 特徴 |
|---|---|---|
.ts (MPEG-TS) |
地デジ録画・ストリーミング | 日本の地デジはMPEG-2 Video+AAC、パケット長188byte |
.m2ts |
Blu-ray / BDAV | MPEG-2・H.264・HEVC、AAC・AC-3・DTS・LPCM など |
.mts |
AVCHDカメラ | 基本は .m2ts と同じ(AVCHD規格) |
中身の映像(MPEG-2 Video・H.264・HEVC)も、音声の多く(AAC・AC-3・DTS)もMP4に入れられるので、**コンテナ(動画の入れ物)だけをMP4に差し替える「リムックス」**がいちばん効率的です(Blu-rayのLPCM音声はMP4に入れられません。7章)。ただし、地デジのMPEG-2映像はリムックスしてもMPEG-2のままです。iPhoneやAndroidが対応をうたう形式にMPEG-2は入っていないので、スマホで見るならH.264に再エンコードします(9章のエラー2)。
2. 最速・無劣化リムックス
基本コマンドはこれだけです。
ffmpeg -i input.ts -c copy -movflags +faststart output.mp4
-c copy:再エンコードしないので、数秒で終わります。-movflags +faststart:moov(再生に必要な目次の情報)をファイルの先頭に置きます。Webで再生するときに、ダウンロードの途中から再生を始めやすくなります(手元で再生するだけなら不要です)。
aac_adtstoascは付けなくてかまいません
TSのAAC音声には、フレームごとに ADTS(Audio Data Transport Stream)ヘッダが付いています。一方、MP4は ASC(AudioSpecificConfig)をコンテナに1回書くだけの形式です。この変換(aac_adtstoasc)は、MP4に書き出すときにFFmpegが自動で行います(-fflagsの既定値autobsf)。-bsf:a aac_adtstoascを自分で付けると、音声がAC-3のファイルではCodec 'ac3' ... is not supported by the bitstream filterで止まり、TSに書き出すときは音声が壊れます。
字幕を落としてシンプルに
地デジのTSにはARIB字幕が入っていることが多く、これはMP4と互換性がありません。字幕を外して、映像と音声だけを出力します。
ffmpeg -i input.ts -map 0:v -map 0:a -c copy -movflags +faststart output.mp4
3. PCR wraparound(時刻の折り返し)
TSは、PCR(Program Clock Reference)やPTSという時刻情報を33bitで表します。約26.5時間ぶん進むと0に戻る(折り返す)ので、録画の途中で折り返すことがあります。どこで折り返すかは時刻の値しだいで、録画の長さとは関係ありません。
FFmpegは、この折り返しを既定で補正します(-correct_ts_overflow、既定で有効)。途中で時刻が飛んでいる録画も、timestamp discontinuity と表示してつなぎ直し、処理を続けます。
PTS(映像や音声を表示・再生する時刻)が欠けたパケットがある録画なら、-i の前に -fflags +genpts を付けると、DTS(デコードする時刻)からPTSを補えます。
ffmpeg -fflags +genpts -i input.ts -c copy -movflags +faststart output.mp4
長いTSは、先に分割してから1本ずつMP4にすることもできます。
# 1時間ずつに分割
ffmpeg -i input.ts -c copy -map 0 -f segment -segment_time 3600 -reset_timestamps 1 part_%03d.ts
分割したファイルをそれぞれMP4にしてから、あとでconcat(連結)します。
4. CM部分の切り出し(複数区間)
録画から本編だけを抜き出す手順です。
手順1: まず開始・終了時刻を調べる
再生しながら、本編の区切りの時刻をメモします(例:00:01:30 から 00:25:00 と、00:28:00 から 00:52:30 の2パートが本編)。
手順2: 部分切り出し(再エンコードなし)
# パート1 (1分30秒〜25分0秒)
ffmpeg -ss 00:01:30 -to 00:25:00 -i input.ts -c copy part1.ts
# パート2 (28分〜52分30秒)
ffmpeg -ss 00:28:00 -to 00:52:30 -i input.ts -c copy part2.ts
手順3: 2つをconcatしてMP4に
# concat.txt を作成
echo "file 'part1.ts'" > concat.txt
echo "file 'part2.ts'" >> concat.txt
# 結合
ffmpeg -f concat -safe 0 -i concat.txt -c copy -movflags +faststart main.mp4
キーフレーム(単独で表示できる区切りのフレーム)の位置で切りたいときは、
-ssの位置をあらかじめキーフレームに合わせておく必要があります。詳しくは動画をトリミング・カットする方法を参照してください。
5. ARIB字幕の扱い
地デジTSの字幕(クローズドキャプション)は、ARIB STD-B24 という形式です。FFmpegは、TSのまま出力すれば字幕を残せますが、MP4には入れられません(-map 0 などで字幕までMP4に入れようとすると、Could not find tag for codec arib_caption で止まります)。方法は2つあります。
選択肢A: 字幕を削除(推奨)
ffmpeg -i input.ts -map 0:v -map 0:a -c copy -movflags +faststart output.mp4
-map 0:v -map 0:a で映像と音声のストリームだけを選ぶので、字幕は出力に入りません。
選択肢B: 字幕を抽出してSRTに変換
ARIB字幕のデコーダ(libaribcaption・libaribb24)が入ったFFmpegなら、ffmpeg -fix_sub_duration -i input.ts -map 0:s:0 subtitle.srt のように、FFmpegだけでSRTにできます。デコーダが入っているかは ffmpeg -decoders で確かめられます(gyan.dev の full ビルドには両方入っています)。入っていないときは、Caption2Ass_PCR などの別のツールでSRTやASSにします。そのあと、動画に焼き込みます。
# 字幕をSRTで焼き込み(事前に subtitle.srt を用意)
ffmpeg -i input.ts -vf "subtitles=subtitle.srt:force_style='FontName=Meiryo,FontSize=20'" \
-c:a copy -movflags +faststart output_subbed.mp4
焼き込みの詳しい手順は字幕を動画に焼き込む方法を参照してください。
6. ドロップパケットがある録画の修復
電波の状態が悪いときの録画では、TSパケットが一部欠けて(ドロップして)いて、リムックスでエラーが出ることがあります。
対策コマンド
ffmpeg -fflags +genpts -i input.ts -c copy \
-movflags +faststart output.mp4
-fflags +genpts:PTSが欠けたパケットに、DTSからPTSを補います。入力側のオプションなので、-iより前に書きます。
再生すると、パケットが欠けた箇所でカクつくことがあります。パケットの一部が壊れているだけのファイルなら、この方法で最後まで変換できることがあります。音声のフレームが壊れていて Error parsing ADTS frame header で止まるときは、音声だけを再エンコード(-c:v copy -c:a aac)すると最後まで変換できます。
7. BDAV(Blu-ray)からの取り出し
Blu-rayの .m2ts は、レコーダーで録画したディスク(BDAV)なら BDAV/STREAM/、市販のBlu-rayなどのBDMV形式なら BDMV/STREAM/ の中にあります。次の例は BDMV/STREAM/00001.m2ts を直接変換する場合です(BDAVならパスを置き換えます)。
ffmpeg -i BDMV/STREAM/00001.m2ts -c:v copy -c:a copy -map 0:v:0 -map 0:a:0 \
-movflags +faststart output.mp4
音声がLPCM(pcm_bluray)やDolby TrueHDの場合、このコマンドはエラーで止まります。MP4にはLPCMを入れられず、TrueHDのMP4への格納はFFmpegでは試験的な扱いだからです。その場合は -c:a copy を -c:a aac -b:a 192k に替えます。
AACSで暗号化されたBlu-rayは、復号しない限りFFmpegでは処理できません。私的なコピーであっても、技術的保護手段の回避は著作権法第30条1項2号により違法です。
8. バッチ処理(複数TSを一括MP4化)
Windowsでは、次の内容を ts_to_mp4.bat という名前で保存し、TSファイルをこの.batにドラッグ&ドロップします。
@echo off
setlocal enabledelayedexpansion
if "%~1"=="" (
echo 使い方: TSファイルをこの.batにドラッグしてください
pause & exit /b 1
)
:loop
if "%~1"=="" goto end
echo 変換中: %~nx1
ffmpeg -fflags +genpts -i "%~1" -c copy -movflags +faststart "%~dpn1.mp4"
shift
goto loop
:end
echo すべて完了!
pause
bash の場合:
for f in *.ts; do
ffmpeg -fflags +genpts -i "$f" -c copy -movflags +faststart "${f%.ts}.mp4"
done
9. トラブルシューティング
エラー1: Malformed AAC bitstream detected
原因: MP4に書き出すときに aac_adtstoasc を自動でかける設定(-fflags の既定値 autobsf)が外れています。出力側に -fflags genpts のように + を付けずに書くと、この設定が外れます。
解決策: 出力側の -fflags を消すか、+genpts のように + を付けて書きます。-bsf:a aac_adtstoasc を付けても直ります(音声がAACのときだけ使えます)。
エラー2: 変換はできたが再生できない(スマホ)
原因: 地デジの映像はMPEG-2 Videoで、-c copy ではMPEG-2のままMP4に入ります。iPhoneやAndroidが対応をうたう形式にMPEG-2は入っていないので、スマホでは再生できないことがあります。
解決策: 映像をH.264に再エンコードします(Q4のコマンド)。1440×1080の映像は、横長の画素(SAR 4:3)で16:9に表示するハイビジョンで、再エンコードしても16:9のまま表示されます。
エラー3: 音声が2つある(副音声・二ヶ国語)
原因: 音声が2つ以上ある番組では、音声ストリームが複数に分かれています。ただし二ヶ国語放送は、1本の音声ストリームに主・副の2つの音声を入れた「デュアルモノ」で送られることもあり、その場合は -map 0:a:0 では分けられません。
解決策:
# 主音声だけ
ffmpeg -i input.ts -map 0:v:0 -map 0:a:0 -c copy output.mp4
# 両方保持(Windows Media Player では切り替えられる)
ffmpeg -i input.ts -map 0:v:0 -map 0:a -c copy output.mp4
エラー4: チャプターが消える
原因: TSには、FFmpegが読めるチャプター情報がありません。-map_chapters 0 を付けても引き継げません。
解決策: MP4にしたあとで、チャプターを付け直します。
エラー5: BS4K(ISDB-S3、4K放送)の録画を読み込めない
原因: BS4K・110度CS4Kの放送は、地デジと違ってMPEG-TSではなくMMT・TLVという方式で多重化されています。FFmpeg 8.1にはこの形式を読み込む機能がないため、録画ファイルをそのまま -i に渡しても変換できません。
解決策: 録画した機器やソフトの書き出し機能で、MP4などの形式にしてから扱います。
FAQ
Q1. TsSplitter で分割してからFFmpegに渡すべき?
A. 以前は必要でしたが、今のFFmpegは地デジのTSを直接扱えるので、ほとんどの場合はFFmpegだけで足ります。ドロップの多い録画に限り、先にTsSplitterで処理しておくと効くことがあります。
Q2. BonDriver+TVTest録画のファイルは .ts ですが、なぜ拡張子 .m2ts ではない?
A. 日本の地デジは MPEG-TS (188 byte packets) のまま保存されるので、拡張子も .ts にするのが慣例です。BDAVの .m2ts(192 byte packets)は、同じTSにタイムスタンプを足した形式です。FFmpegではどちらも同じように扱えます。
Q3. リムックスすると画質が落ちる?
A. 落ちません。-c copy はビットストリーム(圧縮されたデータ)をそのままコピーするので、1ビットも変わりません。
Q4. 変換後ファイルが再生できない動画プレーヤーがある
A. -movflags +faststart を付けたか、HEVCの録画なら -tag:v hvc1 を付けたかを確認します。それでも再生できなければ、H.264 に再エンコードします。
ffmpeg -i input.ts -c:v libx264 -crf 20 -c:a aac -b:a 192k -movflags +faststart output.mp4
Q5. なぜ地デジ録画にこんなに面倒が多い?
A. 地デジのTSは、放送局側の多重化の仕様(ARIB STD-B10/B32)どおりに保存したデータで、字幕・データ放送・番組情報(EIT)・緊急警報放送(EWS)の情報なども含む大きなストリームです。MP4にするときは、FFmpegでこれらを捨てて本編だけを取り出します。