ffmpegで4:3に黒帯をはめ込んで16:9にした動画から黒帯を削除して4:3のアスペクト比に変更する

Posted by 雅楽斎 on Tuesday, January 21, 2020

TOC

4:3時代の動画を現在のフォーマットにはめて流したと思われる16:9動画。黒帯(以下、パディング)部分に宣伝とか書かれると本編の邪魔になるし映像の両端をガウスぼかしではめ込むとそこに割り当てるビットレートがもったいないだろ状態なのでなんとかして機械的に取れないかと思った結果のノウハウです。

ただし、これをやるとエンコードが走るのを避けられないので、ビットレートを上げてファイルサイズが増えるのを我慢するか同程度のビットレートで再エンコードして画質の劣化に目を瞑るかのどちらかになると思います。

縦解像度が1080の場合のパディングの幅

今回、解像度が1440x1080で再生時に1920x1080になる動画ファイルを元に、パディングに使われている幅を計算します。(地デジでもマルチチャンネル以外でよく使われる解像度です)

まず、1920に見えている横解像度が実際には1440なので、本編の映像幅が実際にはいくつなのか、拡大している倍率を計算すると、1920÷1440=1.33(循環小数)となります。

1440に見えている本編映像の幅は1440÷1.33=1082.7となり、恐らく1080であろうという前提で計算をすると、左右のパディングの幅は(1440-1080)÷2=180。180pxずつで処理をすれば良さそうということになります。

また念の為、以前BSデジタル放送で使われていた本当に横の解像度が1920の場合のパディング計算についても触れましょう。

横解像度1920に4:3の映像を乗せる場合は横幅1440にした映像を使えばいいので、左右のパディングの幅は(1920-1440)÷2=240。240pxずつ処理をすると良さそうです。

対象となる元の動画

今回はffmpeg -iでは以下の通り表示される動画の両端を切り取ります。

$ ffmpeg -i source.m2ts
Input #0, mpegts, from '00000.m2ts':
  Duration: 00:04:40.19, start: 0.580478, bitrate: 8368 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: mpeg2video (Main) (HDMV / 0x564D4448), yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 224 kb/s
At least one output file must be specified

オーディオの方は一旦無視して、Program 1のStream #0.0から動画の解像度は1440x1080、DARが16:9なので再生時には16:9のアスペクトである1920x1080として再生する動画ということがわかります。なお、SAR、DARの説明については計算をしてくれるサイトに説明も書かれていますのでご参考まで。

ピクセルアスペクト比計算機 Ver.2.2

実際に実行するffmpegのオプション

実際に実行するffmpegのオプションは以下となります。また、ビットレートを元よりもだいぶ上げてffmpegにエンコードさせてます。

$ ffmpeg -i source.m2ts -vf crop=in_w-360:in_h:180:0 -c:v mpeg2video -b:v 15M -copyts -flags +ilme+ildct -top 1 -c:a copy dest.m2ts

使用している引数の意味は以下の通りとなります。

  • -i source.m2ts 入力ファイルの指定
  • -vf crop=in_w-360:in_h:180:0 出力動画の幅(in_w-360)、出力動画の高さ(in_h)、左端からの距離(180)、上端からの距離(0)を指定する。in_wは元の動画の幅、in_hは元の動画の高さ。
  • -c:v mpeg2video 映像コーデックとしてmpeg2を使用。-c:vは-vcodecと同じ。
  • -b:v 15M 映像ビットレートを15Mbpsでエンコードする
  • -copyts 元ファイルのタイムスタンプを保持する。MPEG2-TSの場合必須
  • -flags +ilme+ildct 元がインターレースの動画の場合必須。プログレッシブなら不要
  • -top 1 インターレース動画のフィールドオーダー。入力ファイルに合わせる。1はトップファースト、0はボトムファースト。-1は自動
  • -c:a copy 音声コーデックは元のものをそのまま使う(なんの処理もしない)。-c:aは-acodecと同じ。

-vf cropが今回のミソで、出力動画の幅をin_w-360とすることで1440-360=1080、左端からの距離を180にすることで左端から180px、そこから1080px分を出力するため、その右にある180px(右側のパディング分)は出力されません。

これで出力された動画ファイルは以下のような情報になります。

$ ffmpeg -i dest.m2ts
Input #0, mpegts, from 'dest.m2ts':
  Duration: 00:04:40.18, start: 1.967233, bitrate: 13150 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, top first), 1080x1080 [SAR 4:3 DAR 4:3], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x101]: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, stereo, fltp, 224 kb/s
At least one output file must be specified

解像度が1080x1080、再生時には4:3のアスペクト比で再生される動画であることが確認できます。

スポンサーリンク


comments powered by Disqus