手動でフィールド処理を行う fieldhint


フィールドオーダーが予め分かっている場合に、テキストファイルに正しいフィールドオーダーを記載することでどのインターレス解除フィルタよりも高速にプログレッシブ化できる fieldhint の使い方。いわゆる手動インターレース解除フィルタである。間引くフレームも分かるので decimate ではなく trim を使うことでより正確に処理ができる。フィールドを選択できるのが fieldhint でフレームを選択するのが select。固定周期なら一度の指定で済むが途中で周期が変わると ffmpeg だけでは場所の特定が難しい。

関連記事
ffmpeg でインターレース解除

基本コマンド

単純なプログレッシブ化
ffmpeg -i input -vf fieldhint=hint.txt:relative output
ffmpeg -i input -vf fieldhint=hint.txt:1 output
ffplay -i input -vf fieldhint=hint.txt:1

ntsc 29.976 フレームの動画を trim を併用して5フレーム中2フレーム目を間引く例(n は 0 スタート)。trim で間引く場合は fps で正しいフレームレートを指定しないと再び重複フレームが作られる
ffmpeg -i input -vf fieldhint=hint.txt:relative,select=(mod(n-1\,5)),fps=24000/1001 output

trim フィルタの使い方
ffmpeg で使える計算書式

公式ドキュメント:FFmpeg Filters Documentation : fieldhint

オプション

  • hint[string]
    フィールド指定ファイルを指定する
    既定値はないので必ず指定する
  • mode[int]
    フィールド指定ファイルのフレーム番号の指定方法
    既定値:absolute
    範囲:0 から 1 まで

    • 0, absolute
      絶対フレーム番号指定。既定値
      範囲:現在フレーム番号から前後1フレーム
    • relative
      相対フレーム番号指定
      範囲:-1 から 1 まで

hintファイルの書き方

出力フレーム数が hintファイルのフレーム数に収まっていないとエラーになるので余裕を持って記入しておく。フィールド指定の後に +, - を指定することで + ならインターレス、- ならプログレッシブのフラグを立てることがつける必要は無い。また #, ; でコメントを記入できる。既定値は absolute だが hintファイルは relative のほうが書きやすい。

relative 向けの hintファイルの例

0,0 # 1番フレーム, 1番フレームのトップフィールドと1番フレームのボトムフィールドを合わせて1フレームにする
0,0 # 2番フレーム, 2番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
0,-1 # 3番フレーム, 3番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
0,-1 # 4番フレーム, 4番フレームのトップフィールドと3番フレームのボトムフィールドを合わせて1フレームにする
0,0

absolute 向けの hintファイルの例

0,0 # 1番フレーム, 1番フレームのトップフィールドと1番フレームのボトムフィールドを合わせて1フレームにする
1,1 # 2番フレーム, 2番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
2,1 # 3番フレーム, 3番フレームのトップフィールドと2番フレームのボトムフィールドを合わせて1フレームにする
3,2 # 4番フレーム, 4番フレームのトップフィールドと3番フレームのボトムフィールドを合わせて1フレームにする
4,4

フィルタの効果を調べる方法

最初にフレーム番号は1から始まるが、映像に表示される数字は0から始まるのをよく覚えておく。drawtext のフレーム番号は 0 スタートなのでプラス1がフレーム数になる。

0から71までの数字(左上)72フレームを記載した3秒のテスト動画
ffmpeg -f lavfi -i color=white:s=200x200:r=24000/1001:d=3,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=64" -vcodec utvideo sample.mkv

さらにテレシネして0から89までの数字(右下)90フレームを記載したトップフィールドファーストの動画
ffmpeg -i sample.mkv -vf telecine,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=30:x=W-tw:y=H-th" -vcodec utvideo telecine.mkv

トップフィールドを調べるには field=0、ボトムフォールドを調べるには field=1 を使う
ffmpeg -i telecine.mkv -vf field=0 -vcodec utvideo top.mkv

するとこのような元のフレーム番号が出力される(10の位は省略)

num   :1234567890123
top     :0112345567899
bottom:0123345677890

それをこのように書き換える

num   :1234567890123
top     :0112345567899
bottom:0112345567899

relative 向けの hintファイルの例を使ってプログレッシブにして左下にフレーム番号をつけた動画
ffmpeg -i telecine.mkv -vf fieldhint=23pulldown.csv:relative,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=30:x=0:y=H-th" -vcodec utvideo fieldhint-23pulldown.mkv

23pulldown.csv

0,0
0,0
0,-1
0,-1
0,0
;以下ループ

次に 2, 3, 7, 8 番目のフレームが重複しているので 2, 7 番目のフレームを trim で間引く。動画出力する場合は fps でフレーム数を間引いた後の値を指定する。
ffmpeg -i telecine.mkv -vf fieldhint=23pulldown.csv:relative,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=30:x=0:y=H-th",select=(mod(n-1\,5)),fps=24000/1001 -y -vcodec utvideo select-mod-n-1.mkv

重複フレームと trim の関係

あるのかどうかは知らないが間引く最初の1フレームだけインターレースの場合は、片フィールドしかないのでフィールドをずらさずに先にカット trim=start_frame=1。ffmpeg のログ出力は 0フレームスタートだが、1フレームスタートの方が感覚的にわかりやすい。映像がすでにプログレッシブで重複フレームがある場合は、間引くフレームの該当フレームを調べる

0フレームスタート

ボトムフィールド 縞フレーム trimコマンド 間引くフレーム
00-1-1000-1-10 2378 (mod(n-1\,5)) 16 23プルダウン
0-1-1000-1-100 1267 (mod(n\,5)) 05 32プルダウン
-1-1000-1-1000 0156 (mod(n-4\,5)) 49
04590 (mod(n-3\,5)) 38
000-1-1000-1-1 3489 (mod(n-2\,5)) 27

1フレームスタート

ボトムフィールド 縞フレーム trimコマンド 間引くフレーム
00-1-1000-1-10 3489 (mod(n-1\,5)) 27 23プルダウン
0-1-1000-1-100 2378 (mod(n\,5)) 16 32プルダウン
-1-1000-1-1000 1267 (mod(n-4\,5)) 50
1560 (mod(n-3\,5)) 49
000-1-1000-1-1 4590 (mod(n-2\,5)) 38

ffmpeg で時間単位やフレーム単位でカットする方法
trim フィルタの使い方

コメントを残す

メールアドレスが公開されることはありません。