adbird(広告鳥) 備忘録

ffmpegでTS(m2ts)ファイルをmp4に変換

動画の変換はGUIのWinFFというソフトがシンプルで簡単だったのでそれを使っていた。

しかし、あるTSファイルをWinFFでmp4に変換したら、変換後のmp4から音声が出ない…。

あるTSファイルとはNHKの番組を録画したもので、目的の番組の前にニュースなどがちょっとだけ録画されてしまっていて、vlcで再生する際に音声がスローになってブツブツ切れてしまうファイル(界隈では結構有名な音声切り替えによるトラブル)。

TSファイルを見るだけなら、vlc再生時に一度音声を無効にしてから、また音声を有効にすればよいのだが、そのままだとファイルサイズが巨大すぎるのでmp4に変換してファイルサイズを小さくしたい。

WindowsならTsSplitterというソフトで対処できるらしい。

が、僕はUbuntuだし、わざわざwineを使ってまでWindowsのソフトを使いたくはない。

そこでいろいろ調べて、試行錯誤した結果、次のようにすれば問題のあるTSファイルでも変換できた。

シェルスクリプト

以下のような「tstomp4.sh」を作る。

# 音声エンコードなし
#ffmpeg -y -vsync 1 -i $1.m2ts -f mp4 -vcodec libx264 -map 0:0 -map 0:1 -s 1280x720 -aspect 16:9 -acodec copy -bsf:a aac_adtstoasc -ss $2 $1.mp4

# 音声ac3
#ffmpeg -y -vsync 1 -i $1.m2ts -f mp4 -vcodec libx264 -map 0:0 -map 0:1 -s 1280x720 -aspect 16:9 -acodec ac3 -b:a 192k -ss $2 $1.mp4

# 音声aac
ffmpeg -y -vsync 1 -i $1.m2ts -f mp4 -vcodec libx264 -map 0:0 -map 0:1 -s 1280x720 -aspect 16:9 -codec:a aac -bsf:a aac_adtstoasc -strict -2 -ss $2 $1.mp4

音声切り替えトラブルのないTSファイルなら、上記の「音声エンコードなし」でもいいのだが、音声切り替えトラブルがあるTSファイルの場合は「音声ac3」(ac3はDVD-Videoの音声コーデック)か「音声aac」にする。上記スクリプトでは「音声aac」にしている(それ以外はコメントアウトしている)。

  • $1 に動画ファイル名が入る。
  • map 0:0 が映像ストリーム、map 0:1 が音声ストリーム。
  • $2 に変換開始時間が入る(x秒後のところから変換する)。

実行

「tstomp4.sh」と変換したいTSファイルを同じフォルダに入れて、端末で開いて以下を実行。

sh tstomp4.sh [ファイル名。ただし、拡張子は書かない。] [変換開始時間]

例えば、hoge.m2ts というファイルの開始から5秒後のところから変換したい場合は、

sh tstomp4.sh hoge 5

とする。