adbird(広告鳥) 備忘録

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

以前も「ffmpegでTS(m2ts)ファイルをmp4に変換」という記事を書いたことがあるけど、それではいちいち変換するファイル名を入力しなくてはいけなかった。

短いファイル名なら大して苦ではないけど、長いファイル名だと入力やコピペも面倒だったので、その手間をなくしてもっと簡単にする方法。

なお、環境はUbuntu18.04。

シェルスクリプト

tstomp4.sh スクリプトを作る。

for f in *.m2ts; do

# ①音声エンコードなし 開始時間のみ指定する
#ffmpeg -y -vsync 1 -i ${f%.*}.m2ts -f mp4 -vcodec libx264 -map 0:0 -map 0:1 -s 1280x720 -aspect 16:9 -acodec copy -bsf:a aac_adtstoasc -ss $1 ${f%.*}.mp4

#②音声エンコードなし 開始時間と終了時間を指定する。
ffmpeg -y -vsync 1 -ss $1 -i ${f%.*}.m2ts -f mp4 -vcodec libx264 -map 0:0 -map 0:1 -s 1280x720 -aspect 16:9 -acodec copy -bsf:a aac_adtstoasc -t $(($2*60+$3-$1)) ${f%.*}.mp4

# ③音声aacエンコード 開始時間のみ指定する
#ffmpeg -y -vsync 1 -ss $1 -i ${f%.*}.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 ${f%.*}.mp4

# ④音声aacエンコード 開始時間と終了時間を指定する。
#ffmpeg -y -vsync 1 -ss $1 -i ${f%.*}.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 -t $(($2*60+$3-$1)) ${f%.*}.mp4

done

上記では、②を有効にしていて、それ以外は無効にしている状態。

  • for f in *.m2ts; do : フォルダ内にある全ての「.m2ts」に対して実行する。
  • ${f%.*}.m2ts ${f%.*}.mp4 : 上記で探した「.m2ts」データの名前(拡張子をのそく)が ${f%.*} に入る。
  • $1 : 後述の開始時間(秒)が入る。
  • $2 : 後述の終了時間(分)が入る。
  • $3 : 後述の終了時間(秒)が入る。

実行

任意のフォルダに上記 tstomp4.sh スクリプトと、変換したいm2tsファイルを入れる。

開始時間のみ指定する場合

ようは動画の冒頭部分をカットする場合。(冒頭をカットせず、一番最初から変換する場合は、開始時間を 0 にする。)

①か③のコメントアウトを外して(行の最初の # を削除する。for f in *.m2ts; dodone 以外の他の行は # をつけてコメントアウトする)、次を実行。

$sh tstomp4.sh [開始時間(秒)]

例えば、開始時間が10秒の場合、次の通り。

$sh tstomp4.sh 10

開始時間と終了時間を指定する場合

冒頭分だけでなく、お尻の部分もカットする場合。

②か④のコメントアウトを外して(行の最初の # を削除する。for f in *.m2ts; dodone 以外の他の行は # をつけてコメントアウトする)、次を実行。

$ sh tstomp4 [開始時間(秒)] [終了時間(分)] [終了時間(秒)]

例えば、15秒のところから開始して、25分30秒のところで終了する場合は次の通り。

$ sh tstomp4 15 25 30

ここでの「終了時間」とは、元のm2tsファイルの動画のシークバー上で表示される時間。

ffmpegは、例えば、-ss 10-t 30 のオプションを使った場合、元の動画の冒頭10秒を切り取り、そこから30秒間が変換されるということになる。つまり、終了時点は元の動画のシークバーで表示されるところの40秒(10秒+30秒)の時点となる。

例えば、元の動画の冒頭10秒をカットして、元の動画のシークバーで表示されるところの50秒時点で変換を終わらせたい場合、オプションは-ss 10-t 40 にしないといけない。

しかし、長い動画の場合、いちいち「開始から○○秒後」と終了時間を計算するのが面倒くさいので、その手間を省くために -t $(($2*60+$3-$1)) とした。