3 x 3、5 x 5または7 x 7(ffmpeg 4.0 以降)のカーネルが指定できるconvolution(畳み込み)フィルタの使い方。数学的な話はここでは説明しない。
高速で万能な逆テレシネフィルタ pullup
pullupフィルタは逆テレシネフィルタで、ハードテレシネや24000/1001fpsプログレッシブや 30000/1001fpsプログレッシブの混在した映像に対応している。ただし60i混在の30p化はうまくできない。未来フレームを参照するように設計されていてパターン周期が不定期でも正しく逆テレシネし、不要な重複フィールドを自動で間引く。片フィールド補間は行わないのでその部分の映像はなめらかにはならない。入力フレームレートが29.97fpsの場合は24000/1001fpsに、30fpsや(まれに)テレシネされた25fpsの場合は24fpsになる。
pullupフィルタの後のPTS間隔はフレームを間引く前と変わらないVFRになり、そのまま出力するとフレームレートが元の映像のままになるので間引かれた後のフレームレートを指定することでPTS間隔も修正される。
ffmpeg でインターレース解除
映像と音声の pts を扱う setpts, asetpts
基本コマンド
日本で一般的なNTSCを24000/1001fpsプログレッシブに変換する。
2016年4月8日 ffplay は出力オプションに-rが使えなかったので直した。
ffmpeg -i input -vf pullup -r 24000/1001 output
ffplay -i input -vf pullup,fps=24000/1001
再生だけならPTSを修正するだけでもよい。
ffplay -i input -vf pullup,setpts=N/((24000/1001)*TB)
ffmpeg でのフレームレート設定の違い
ffmpegにはフレームレートの設定方法がいくつかあるが、同じオプションでも指定場所では効果が違ったりするので一般的な用途のまとめ。オリジナルよりもフレームレートが少ないときは同じように間引かれるが、出力結果も一致するとは限らない。オプションの-rは出力コンテナによって既定値が異なるのでMP4出力時と今回テストしているMKVとでは結果が異なり以下に説明している-fps_modeも併用する。
公式Wiki:ChangingFrameRate – FFmpeg
ffmpeg – Framerate vs r vs Filter fps – Stack Overflow
changing the framerate: “fps=X” filter vs “-r X” option : ffmpeg
2016年2月のニコ生統計
集計期間は週間のニコ生統計の2月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。
テレシネ処理ができる telecine
テレシネしてフレーム数を増やすことができるtelecineフィルタの使い方。日本で一般的なテレシネからヨーロッパ形式のテレシネまでいろいろなタイプを指定できる。
基本コマンド
インターレース具合がわかりやすいようにフレーム番号を振っている
ffplay -f lavfi -i color=black:r=24000/1001:d=10,drawtext=fontfile=C\\://WINDOWS/Fonts/msgothic.ttc:text='%{n}':fontcolor=yellow:x=(w-tw)/2:y=(h-th)/2:fontsize=64,telecine
インターレースの動画でfpsが2倍に読み込まれるときには-bsf:v h264_metadata=fixed_frame_rate_flag=1を指定する。
ffmpeg -i input -c:v libx264 -flags +global_header+ilme+ildct -weightp 0 -bsf:v h264_metadata=fixed_frame_rate_flag=1 output
ffmpegで29.97iの動画(m2ts)を生成して、TMPGenc Authoring Worksで取り込むと59.97iで認識されて困ってる…。VLCで開くと29.97だし、特に異常な点は見られない…。 https://x.com/nogisawa/status/1821485468481200220
— やむ/nogisawa (@nogisawa) August 8, 2024
インターレースを解除する bwdif
bwdif(Bob Weaver Deinterlacing Filter)フィルタはyadifフィルタとキュービック補間アルゴリズムが使われているw3fdifフィルタを元とする動きに対応したインターレース解除フィルタである。
修正 2016年6月27日
deint オプションの初期値が最初のコミットからメジャーアップデートの 3.1 に変わるときに 0, all に変更。
インターレース解除フィルタ w3fdif
w3fdifフィルタとは BBC R&D の Martin Weston氏を元とし、BBC R&D の Jim Easterbrook氏がインターレース解除の機能を実装した片フィールド補間のインターレース解除フィルタである。w3fdif とは “Weston 3 Field Deinterlacing Filter”。mode、parityがオプションの間に追加されたのでオプション名を指定してないと設定内容が以前と異なる。
関連記事
ffmpeg でインターレース解除
基本コマンド
ffplay input -vf w3fdif:filter=1:mode=1:parity=-1:deint=0
ffplay input -vf w3fdif=1:1:-1:0
公式ドキュメント:FFmpeg Filters Documentation : w3fdif
オプション
- filter[int]
インターレースの係数指定 - 0, simple:単純。低負荷
- 1, complex:複雑。高負荷。既定値
- mode[int]
インターレースの種類 - 0, frame:2枚のフィールドから1枚のフレームを作る
- 1, field:1枚のフィールドから1枚のフレームを作る。いわゆる片フィールド補間でフレーム数が2倍になる。既定値
- parity[int]
トップボトムどちらが先かを指定する - 0, tff:トップフィールドファースト
- 1, bff:ボトムフィールドファースト
- -1, auto:自動設定。既定値
- deint[int]
どのフレームを処理するか - 0, all:すべて。既定値
- 1, interlaced:インターレースフラグがあるのだけ
一番メジャーなインターレース解除フィルタ yadif
インターレース解除といえばとりあえずこのフィルタの名前が挙がるほど有名なフィルタ。yadifはyet another deinterlacing filterの略語。
手動でフィールド処理を行う fieldhint
フィールドオーダーが予め分かっている場合に、テキストファイルに正しいフィールドオーダーを記載することでどのインターレス解除フィルタよりも高速に逆テレシネ、プログレッシブ化できるfieldhintフィルタの使い方。いわゆる逆テレシネフィルタである。
間引くフレームも分かるのでdecimateフィルタではなくtrimフィルタを使うことでより正確に処理ができる。フィールドを選択できるのがfieldhintフィルタでフレームを選択するのがselectフィルタ。固定周期なら一度の指定で済むが途中で周期が変わると ffmpeg だけでは場所の特定が難しい。weaveフィルタでフィールドをフレームに並べてshuffleframesフィルタで一定周期のフレームを間引ける。
- ffmpeg でインターレース解除
- 指定フレーム毎に順番を入れ換える shuffleframes
- 2つの連続したフィールドを1つのフレームで出力する weave
- 特定の映像フレームや音声サンプルを出力する select, aselect
基本コマンド
単純なプログレッシブ化
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
ffmpeg – remove sequentially duplicate frames – Stack Overflowよりtrimフィルタを使わずにmpdecimate, decimateフィルタを代わりに使う。
ffmpeg -i input -vf decimate output
ffmpeg -i input -vf mpdecimate,setpts=N/FRAME_RATE/TB output
CIE 色度図を表示する ciescope
CIE色度図を表示するciescopeフィルタの使い方。出力ピクセルフォーマットはrgba64leなので余白部分をオーバーレイで透過できる。
基本コマンド
ffplay input -vf ciescope=system=7:cie=0:gamuts=0:s=512:i=0.001:contrast=.75:corrgamma=1:showwhite=0:gamma=2.6:fill=1
ffplay input -vf ciescope=7:0:0:512:.001:.75:1:0:2.6:1

オーバーレイする例。
ffplay input -vf split[v],ciescope,[v]overlay=x=0:y=0
- CIE色の見えモデル2002 : CIECAM02/jp – RawPedia : archive.org
- 2018/3/121視覚や色の規格化の最新動向:PDF
- CIE色の見えモデル(CIECAMO2)の概要とその応用:PDF