高速で万能な逆テレシネフィルタ 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 Filters Documentation : pullup

Continue reading “高速で万能な逆テレシネフィルタ pullup”

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

Continue reading “ffmpeg でのフレームレート設定の違い”

2016年2月のニコ生統計

集計期間は週間のニコ生統計の2月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。

Continue reading “2016年2月のニコ生統計”

テレシネ処理ができる 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 Filters Documentation : telecine

Continue reading “テレシネ処理ができる telecine”

インターレースを解除する bwdif

bwdif(Bob Weaver Deinterlacing Filter)フィルタはyadifフィルタとキュービック補間アルゴリズムが使われているw3fdifフィルタを元とする動きに対応したインターレース解除フィルタである。

修正 2016年6月27日
deint オプションの初期値が最初のコミットからメジャーアップデートの 3.1 に変わるときに 0, all に変更。

ffmpeg でインターレース解除

Continue reading “インターレースを解除する bwdif”

インターレース解除フィルタ 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の略語。

ffmpeg でインターレース解除

Continue reading “一番メジャーなインターレース解除フィルタ yadif”

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

フィールドオーダーが予め分かっている場合に、テキストファイルに正しいフィールドオーダーを記載することでどのインターレス解除フィルタよりも高速に逆テレシネ、プログレッシブ化できるfieldhintフィルタの使い方。いわゆる逆テレシネフィルタである。

間引くフレームも分かるのでdecimateフィルタではなくtrimフィルタを使うことでより正確に処理ができる。フィールドを選択できるのがfieldhintフィルタでフレームを選択するのがselectフィルタ。固定周期なら一度の指定で済むが途中で周期が変わると ffmpeg だけでは場所の特定が難しい。weaveフィルタでフィールドをフレームに並べてshuffleframesフィルタで一定周期のフレームを間引ける。

基本コマンド

単純なプログレッシブ化
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 – 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

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

Continue reading “手動でフィールド処理を行う fieldhint”

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

ciescope のサンプル画像

オーバーレイする例。
ffplay input -vf split[v],ciescope,[v]overlay=x=0:y=0

映像の上に映像をのせる overlay

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

Continue reading “CIE 色度図を表示する ciescope”

フィルタのベンチマークを調べることができる bench, abench

平均負荷と最大負荷、最小負荷を調べることができる。

基本コマンド

縦横半分にscaleでリサイズしたビデオフィルタのベンチマーク
ffmpeg -i input -vf bench=start,scale=iw/2:-1,bench=stop -an -f null -
ffplay -i input -vf bench=start,scale=iw/2:-1,bench=stop

オーディオフィルタcompandのベンチマーク
ffmpeg -i input -af abench=start,compand,abench=stop -an -f null -
ffplay -i input -af abench=start,compand,abench=stop

Windows の ffmpeg で生放送する方法 : compand

公式ドキュメント:FFmpeg Filters Documentation : bench, abench

Continue reading “フィルタのベンチマークを調べることができる bench, abench”