adbird(広告鳥) 備忘録

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

追記:

長いファイル名の動画が複数ある場合などはファイル名の入力・コピペが面倒。

そこで動画名を入力しないですむ、もっと楽な方法を書きました。

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

下記の内容より、↑ の方法をオススメします。


※注意:下記の記事の環境はUbuntu14.04です。現在のUbuntu18.04環境では再生時の音声トラブルも、WinFF変換時の音声トラブルもなくなったっぽいです。普通にWinFFを使えばトラブルなく変換できています。

  • WinFF ←Windowsの人はここで「Clone or download」をクリックして、「Download ZIP」でzipファイルをダウンロードしてインストールすればいいはず。
  • QWinFF 使ったことはないけど、これも良さげ。

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

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

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

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

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

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

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

シェルスクリプト

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

(べつにシェルスクリプトを作らなくても、好きなものを選んで、端末で実行してもいい。動画名を2回入力するのが面倒なので、これを作った。)

# 音声エンコードなし
#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 [ファイル名。ただし、拡張子は書かない。] [変換開始時間]

例えば、test.m2ts というファイルの、冒頭3秒間にニュース等が録画されているとする。
そこで冒頭から(余裕を持って)5秒後、つまり目的の番組が始まったところから変換する場合は、

sh tstomp4.sh test 5

とする。test.mp4 ができているはず。

シンプルな方法(音声エンコードなし)

なお、冒頭部分をカットせずにたんに変換する場合は以下のコマンド。ただし、前記したように、古い環境では音声切替で問題が出る恐れあり。

$ ffmpeg -y -vsync 1 -i 入力.m2ts -f mp4 -vcodec libx264 -map 0:0 -map 0:1 -s 1280x720 -aspect 16:9 -acodec copy -bsf:a aac_adtstoasc 出力.mp4

変換するファイル名が長いときや、ファイルが複数ある場合は、上記コマンドでは面倒くさいので、ffmpegでTS(m2ts)ファイルをmp4に変換 2019年版 を強くオススメする。