フィールドオーダーが予め分かっている場合に、テキストファイルに正しいフィールドオーダーを記載することでどのインターレス解除フィルタよりも高速にプログレッシブ化できる fieldhint
の使い方。いわゆる手動インターレース解除フィルタである。間引くフレームも分かるので decimate
ではなく trim
を使うことでより正確に処理ができる。フィールドを選択できるのが fieldhint
でフレームを選択するのが select
。固定周期なら一度の指定で済むが途中で周期が変わると ffmpeg だけでは場所の特定が難しい。
基本コマンド
単純なプログレッシブ化
ffmpeg -i input -vf fieldhint=hint.txt:relative output
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
フィールド指定ファイルを指定する
規定値はないので必ず指定する
- mode
フィールド指定ファイルのフレーム番号の指定方法
規定値:absolute
0 から 1[int]
- 0, absolute
絶対フレーム番号指定。規定値
現在フレーム番号から前後1フレーム
- relative
相対フレーム番号指定
-1 から 1[int]
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 |
|