📼

ffmpegで1からインターレースなmpeg2を作る方法

2023/06/04に公開

インターレースのmpeg2をffmpegを使って作る方法。
既存の動画を変換…するのではなく、自分で準備した連番画像から動画を作る。1フィールドごとに好きな画像を指定出来る。

通常のプログレッシブな動画は1フレームが最小単位だが、インターレースではフィールドが最小単位となる。
トップフィールド・ボトムフィールドを2つ合わせて1フレーム。
TV放送の59.94iというのは、1秒間にフィールドが59.94枚ある事を指す。
フィールドが2つで1フレームなので、フレーム単位では29.97fps。
誤差なのでこの記事では以下60iとする。

手順 1

元の画像を作る。1秒の動画を作りたい場合は、フィールド単位で60枚の画像を準備する。
1フレーム目のトップフィールド→1フレーム目のボトムフィールド→2フレーム目のトップフィールド の順番で作る。
ボトムフィールドはトップフィールドから1ピクセル下にズラした画像を作ること。

1920x1080の解像度のmpegを作りたいので、1フィールドは高さが半分になる。
つまり1920x540 の横長な画像を作る。
画像はfield-0000.pngから始まる連番とする。

手順 2

ffmpegのコマンドは順番にも意味があるので、コマンドの順番を入れ替える時は動作確認をする事。

以下のコマンドを入力。
ffmpeg -y -r 60 -i "field-%04d.png" -c:v mpeg2video -qscale:v 2 -vf tinterlace=0 -flags +ilme+ildct output.mpeg

パラメータの解説

  • -y 上書きを許可する。出力されるoutput.mpegのファイルが既に存在している時は上書きの確認を求められるが、それを常に許可にする。不要であれば削除しても問題ない
  • -r 60 動画のフレームレート。フィールド単位のfpsを指定する。厳密に59.94fpsにしたい場合は-r 60000/1001と割り算を書く。
  • -i "field-%04d.png" 入力ファイル名。連番は0から始まる必要がある。桁数を合わせるためにfield-1000.pngから始めると読み込むことは出来ない。
  • -c:v mpeg2video 動画コーデックがmpeg2videoであるという指定。
    • -c:v-vcodec-codec:vと同じ。
    • まず-vcodecffmepg公式によると「This is an alias for -codec:v」とある。
    • -codec:v同じページ によると-codec[:stream_specifier]を意味する。stream_specifierは同じページ によるとvとかaとかがある。
    • そして-c:v-codec:vの省略形。
  • -qscale:v 2 動画の画質。mpeg2は非圧縮のオプションは無いのでどうしても圧縮がかかるので、クオリティベースの画質を設定。少ないほうが高画質。検証用なので高画質にした。不要であれば取り除いても良い。
  • -vf tinterlace=0 動画をインターレースにする要。1フレームごとにトップフィールド→ボトムフィールド→トップ と繰り返す動画を作る。日本語の解説公式ドキュメントを参照。
  • -flags +ilme+ildct 詳細不明。flagsにilmeildctを付与するという意味。ffmpeg --help fullで確認出来るコマンドによると以下の通り
    • ilmeは「interlaced motion estimation」
    • ildctは「use interlaced DCT」DCTとは離散コサイン変換。非可逆圧縮の方式。
  • output.mpeg 出力ファイル名。拡張子も見ているようなので、mpegから変えない事を推奨。

これで1フィールド単位で好きな画像のmpeg2ファイルを作る事が出来た。

インターレースのmpeg2をフィールド単位で画像化する

2つのコマンドがある。1つの動画から、トップフレームを抽出するコマンドと、ボトムフレームを抽出するコマンドを別々に実行する。

ffmpeg -y -i input.mpeg -vf "il=chroma_mode=deinterleave:luma_mode=deinterleave,crop=iw:ih/2:0:0" filename-%04d-1-top.png
ffmpeg -y -i input.mpeg -vf "il=chroma_mode=deinterleave:luma_mode=deinterleave,crop=iw:ih/2:0:ih/2" filename-%04d-2-btm.png

パラメータの解説

  • il=chroma_mode=deinterleave:luma_mode=deinterleave
    • 入力した動画をフィールドごとに上下二分割するコマンド。デフォルトだとフィールドを混ぜて出力するが、deinterleaveオプションで上下二分割に出来る。彩度の上下分割と輝度の上下分割をそれぞれ指定。日本語記事 参考。
  • crop=iw:ih/2:0:0crop=iw:ih/2:0:ih/2
    • 上下二分割された動画の、上半分だけをpngで保存するか、下半分を保存するかのオプション

全体的にこのサイトが非常に参考になった。
https://nico-lab.net/il_with_ffmpeg/

Discussion