インターレース解除フィルタ 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”

ループ回数を指定できる loop, aloop

ffmpeg で無限入力が可能にで追加されていたが、フィルタを掛けて加工することはできなかった。今回はフィルタ内でループするのでループ回数やループした部分にもフィルタが当てられる。

基本コマンド

1回ループして2回読み込む

asetptsを追加した。2017年10月4日
setptsを追加した。2019年2月20日。これより
ffmpeg -i input -filter_complex loop=1:32767:0,setpts=N/(FRAME_RATE*TB);aloop=1:2.14748e+009:0,asetpts=N/SR/TB

reverseフィルタと併用したループ例。
ffmpeg -f lavfi -i testsrc2=d=5.5 -vf trim=start=3.5:end=5.5,setpts=0.5*PTS-STARTPTS,split[out0][out1];[out0]reverse[r];[out1][r]concat,loop=2:250,setpts=N/25/TB avm.gif

映像と音声を逆再生にエンコードする
Make Boomerang w/ single FFmpeg Command | by Salih Çağlar Ispirli | Apr, 2022 | Mediumから引用。

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

オプション

  • loop[int]
    ループ回数。-1 で無限
    既定値:0
    範囲:0からINT_MAXまで
  • size[int64]
    ループにどれだけバッファサイズを取るか
    loopならフレーム数。aloopならサンプル数
    既定値:0
    範囲:0から32767まで:loop
    範囲:0からINT_MAXまで:aloop
  • start[int64]
    ループするときにどの位置からループするか
    loopならフレーム数。aloopならサンプル数
    既定値:0
    範囲:0からI64_MAXまで

メタデータをコンソールに表示する metadata, ametadata

特定のフィルタで出力されるメタデータを扱うことができるmetadataフィルタの使い方。ametadataフィルタも同じオプションで使うことができる。こちらはコンソールに出力するに対してdrawgraphフィルタは映像にテキストやグラフで出力する。drawgraphフィルタと比べて出力範囲を指定しなくても良いので使いやすい。functionを使うことでメタデータの内容を条件で使い分けることができる。

メタデータを映像化する drawgraph, adrawgraph

基本コマンド

signalstatsフィルタからYDIFを表示している。
ffplay -i input -vf signalstats,metadata=print:key=lavfi.signalstats.YDIF:function=expr:expr='between(VALUE1\,0\,1)'

unsharpフィルタのY差分をssimで表示している。
ffplay -i input -vf split[a][b];[b]unsharp[B];[a][B]ssim,metadata=print:key=lavfi.ssim.Y

drawtextフィルタで映像に書き込む。
ffplay -i input -vf split[a][b];[b]unsharp[B];[a][B]ssim,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:text='"SSIM="%{metadata\:lavfi.ssim.all}'

ebur128フィルタでM、S、Iを同時に表示するにはametadataフィルタを3つ並べる。
ffplay -i input -af ebur128=metadata=1,ametadata=print:key=lavfi.r128.M,ametadata=print:key=lavfi.r128.S,ametadata=print:key=lavfi.r128.I
ffplay -f lavfi -i amovie=input,ebur128=metadata=1,ametadata=print:key=lavfi.r128.M,ametadata=print:key=lavfi.r128.S,ametadata=print:key=lavfi.r128.I[out0];amovie=input[out1]

黒が50%未満を出力せずに、その前のフレームをコピーして出力する。blackframe=0で全フレームを対象に、metadataフィルタで対象フレームを選ぶ。コピーした重複フレームではなく可変フレームで出力するには-vsync vfrにする。
ffmpeg -i input -vf blackframe=0,metadata=select:key=lavfi.blackframe.pblack:value=50:function=less -vsync cfr -c:a copy output

idetフィルタのsingle.progressiveのログをテキストで出力する。
ffmpeg -i input -vf idet,metadata=print:key=lavfi.idet.single.progressive:file=single.progressive.txt -an -f null -

ffprobeでsitiフィルタのlavfi.siti.si,lavfi.siti.tiをcsvで出力する。
ffprobe -v error -f lavfi -i movie=input.mp4,siti -show_entries packet=pts_time -show_entries packet_tags=lavfi.siti.si,lavfi.siti.ti -read_intervals "%1" -of csv > siti.csv

ffprobe の使い方

メタデータを標準出力する。
metadata=mode=print:file=-
metadata=mode=print:file='pipe\:4'

公式ドキュメント:FFmpeg Filters Documentation : metadata, ametadata
公式wiki:FilteringGuide – FFmpeg : Filter Metadata

Continue reading “メタデータをコンソールに表示する metadata, ametadata”

音声統計データを表示する astats

音声統計データを表示するastatsの使い方。メタデータ対応しているので出力したログの加工が容易になる。

基本コマンド

ffmpeg -i input -af astats -vn -f null -

soxのstatsと同じような内容が表示される。
sox input.wav -n -S stats

SoX, SoXI, soxformat マニュアルページ日本語訳

Continue reading “音声統計データを表示する astats”

音量を脈打つように上げ下げできる apulsator

apulsatorはオートパンやトレモロの中間的なフィルタである。ffmpeg ではpantremoloで使える。左右のチャンネルの位相や波形をずらしたりする LFO (low frequency oscillator) を元に音量を変える。オフセットが 0 のときはトレモロと同じように左右のチャンネルを等しく変える。オフセットが 0.5 のときはオートパンのように周波数の半分の位相をずらす。オフセットが 1 のときは再び等しく変え、1 に近づくほどより早く右から左へのスピーカーに音が渡されずれが小さくなる。

基本コマンド

ffplay input -af apulsator=level_in=1:level_out=1:mode=sine:1:amount=1:offset_l=0:offset_r=0.5:width=1:timing=hz:hz=2

ahistogramを併用するとずれ具合が見える化する
ffplay -f lavfi amovie=input,apulsator=level_in=1:level_out=1:mode=sine:1:amount=.8:offset_l=.6:offset_r=1:width=1:timing=bpm:hz=2,ahistogram=dmode=separate:r=25:s=hd720:scale=log:ascale=log:acount=1:rheight=.1:slide=replace[out0];amovie=input,apulsator=level_in=1:level_out=1:mode=sine:1:amount=.8:offset_l=.6:offset_r=1:width=1:timing=bpm:hz=2[out1]

音量のヒストグラムを映像化する ahistogram

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

Continue reading “音量を脈打つように上げ下げできる apulsator”

こもった音や割れた音に変える aemphasis

LPレコードやCDなどのフィルタカーブで強調された素材を作成または復元するaemphasisの使い方。音割れさせたりこもった音に変えたりできる。

基本コマンド

ffplay input -af aemphasis=level_in=1:level_out=1:mode=reproduction:type=cd

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

Continue reading “こもった音や割れた音に変える aemphasis”