タグ別アーカイブ: effects

映像フィルタを当てる前後のデータを見える化する

ffmpeg には多くの映像フィルタと音声フィルタがあるが、その効果を調べるのに主観的な判断だけではなく、客観的な判断ができるように数値を映像に表示したり、ヒストグラムを表示したりすることで映像で差違を見える化する。null フィルタを別のフィルタに変更することでフィルタを当てた同士で比較できる。
続きを読む 映像フィルタを当てる前後のデータを見える化する

手軽にモーションブラー atadenoise

各チャンネルの変化具合と平均化するフレーム数の指定により手軽にモーションブラーを当てることができる atadenoise フィルタの使い方。設定値を 0 にしてもすべてのチャンネルに影響を与えるので色味の変化が大きいと軽くフィルタを当てても変化が大きい。フレーム間で平均化するので3次元デノイズとも言える。

ffmpeg でモーションブラーを掛ける

基本コマンド

ffmpeg -i input -vf atadenoise=0a=.02:0b=.04:1a=.02:1b=.04:2a=.02:2b=.04:s=33:p=7 output
ffmpeg -i input -vf atadenoise=.02:.04:.02:.04:.02:.04:33:7 output
ffplay -i input -vf atadenoise=.02:.04:.02:.04:.02:.04:33:7

続きを読む 手軽にモーションブラー atadenoise

ffmpeg でグレースケールを扱う

フィルタでグレースケールを扱うには大まかに YUV の Y(輝度) を取り出す方法(フォーマットは YUV)と、グレーにフォーマット変換(フォーマットは GRAY)する方法の2通りがある。一般的に前者はリミテッドレンジになるので 16 から 235 の範囲に収まるが処理速度は速い。フルレンジの Y を取り出すには format=yuvj420p でフォーマット変換を行う。一方の後者はフォーマット変換を挟むので処理は遅いが 0 から 255 までのフルレンジを扱える。

extractplanes YUV の Y を取り出す(format=yuv)
-vf extractplanes=y

hue(format=yuv) で彩度を 0 にする方法
-vf hue=s=0

YUV の Y だけそのままに UV を 128 に変換する lutyuv(format=yuv)
-vf lutyuv=val:128:128

グレーにフォーマット変換する方法
-vf format=gray

グレースケール(format=gray)値を確認する
-vf datascope

グレースケール(format=gray)で動画出力するにはエンコーダに ffv1 を使う
ffmpeg -i input -vf format=gray -vcodec ffv1 output.mkv

個別チャンネルの値を映像の場所毎に確認できる datascope

関連記事
各映像チャンネルを分離する extractplanes
Windows の ffmpeg で生放送する方法 : lutyuv

輝度の階調を減らして容量を減らす試み

ffmpeg のフィルタで容量を減らすと言えばたいていの場合デノイズしてのっぺりさせてきたが、今回はデノイズではなくてYチャンネル(輝度)の階調を間引いて容量を減らしてみた。この方法のデメリットはのっぺりしたりぼやけたりはしないが階調が単純化されるのでグラデーションがきれいではなくなる(バンディングがのる)のと、処理が遅いのでリアルタイムエンコード(配信)向きである。

任意で階調を調整できるのでバンディングが目立つところを間引かずに他の所を間引くことで目立たないところで容量を減らすことができる。階調の調整は映像の内容によって変えた方がきれいに見える。

追記 2015年11月6日 0時21分
可逆圧縮(utvideo)の時は確かに容量は減るのだが、不可逆圧縮(libx264)のときはかえって容量は増えて SSIM も悪くなる傾向にあるのでもう少し調べてみる。

追記 2015年11月11日
paletteuse ではなくて lutyuv でも間引くことができるがわずかな効果しかない。Yチャンネルは修正しない方が無難かもしれない。

追記 2017年3月31日
見た目の変化がわかりにくい青色、YUV の U をデノイズした方がよい結果になるかも。使うフィルタは removegrain を使う。

奇数の値を+1繰り上げる。繰り下げる場合は-1。偶数はそのまま。
lutyuv=y="if(mod(val\,2)\,val\,val+1)":u="if(mod(val\,2)\,val\,val+1)":v="if(mod(val\,2)\,val\,val+1)"

その他に removegrain でそれぞれのチャンネルに個別にデノイズ処理する方法もある。

Windows の ffmpeg で生放送する方法 :: グレイン除去

追記ここまで

続きを読む 輝度の階調を減らして容量を減らす試み

ニコ生で使うデノイズフィルタの例

一般的に配信用途でのデノイズには hqdn3d フィルタだけが使われているが、個別のコンシューマゲームとして一番配信されている Splatoon を ffmpeg で配信するときに 384kbps の時間帯ではどうしても画質が維持できない。そこでもう一つデノイズフィルタを加えることで全体の画質を向上させてみた。

使うのは pp フィルタで随分前からブログで紹介していたが、配信向きではないと書いていたので使われることがなかった。しかし色々調べてみると見た目の画質は維持しながら 3D特有のテクスチャーを hqdn3d フィルタ以上にぼかすことが出来るので、複雑な部分をぼかしながら他の場所にビットレートを割ることで全体的に見栄えのよい映像にすることが出来る。

Windows の ffmpeg で生放送する方法 : pp
Windows の ffmpeg で生放送する方法 : 3次元デノイズフィルタ(hqdn3d)

そのほかの関連フィルタ:強力な2次元デノイザ sab
続きを読む ニコ生で使うデノイズフィルタの例

映像と音声を逆再生にエンコードする

reverse を使って逆再生にエンコードする。ただし音声の逆再生は未対応なので別のアプリケーションを使う必要がある。trim 必須なので予めカットしておいた方が処理速度は速い。

2015年7月24日音声の逆再生フィルタも追加された
avfilter: add areverse filter :: git.videolan.org Git – ffmpeg.git/commitdiff

reverse は最近追加されたフィルタなので master を利用する。
avfilter: Add reverse filter :: git.videolan.org Git – ffmpeg.git/commitdiff

trim フィルタの使い方
続きを読む 映像と音声を逆再生にエンコードする

ffmpeg できれいにロゴを消す方法

ffmpeg には標準でロゴを消すフィルタがあるが、以前紹介した特定の場所にだけフィルタを当てる方法と、ロゴ消しに適したロゴデータの作り方を交えてロゴをきれいに消す方法。

ffmpeg でロゴを消すフィルタと言えば、removelogodelogo があるが、ロゴデータを元にロゴを消すのが removelogo で、座標を指定して周りの色でブレンドするのが delogo である。
続きを読む ffmpeg できれいにロゴを消す方法

明るいところ、暗いところにフィルタを当てる

明暗の度合いでもマスクできるのでこれを応用して一つの映像に複数のフィルタを使い分ける方法。特定色なら colorkey フィルタを使ってマスクすることもできる。一般的には映像をシャープにするほど容量は大きく、ぼかすほど容量は小さくなるので、シャープとぼかしを使い分けて高画質配信を目指す。

colorkey の使い方:ffmpeg でクロマキー合成

なぜぼかしも併用するかと言えばビットレートの節約になるのも正しいが、ニコ生のようなビットレート制限が厳しいところでは、低解像度で暗くて見えにくい部分にビットレートをたくさん割り当てる必要はないからである。
続きを読む 明るいところ、暗いところにフィルタを当てる

ffmpeg でモーションブラーを掛ける

SHIROBAKO の15話でモーションブラーが出てきたがそれを ffmpeg でもある程度実現することができるのでその方法の紹介。ポイントは一定周期のフレーム数でブレンドの平均をするところ。

atadenoise フィルタでもっと手軽にモーションブラーを当てることができる
手軽にモーションブラー atadenoise

追記 2015年3月7日
tblend による「とても軽めのモーションブラー」を追加。

続きを読む ffmpeg でモーションブラーを掛ける

ffmpeg で差分動画を作る

Avisynth で言うところの Subtract を ffmpeg の blend を使って差分を表示して比較動画を作る方法。

YUV RGB を比較計算する blend

使うフィルタは blend で設定できる内容はたくさんあるが使うのは difference モードで2つの映像の差異を表示する。そのほかにも映像の YUVA/RGBA の値を四則演算できるが、それぞれの詳しい内容は理解していない。詳しい処理はソースコードを参照。

フレームレートを 30000/1001 から 24000/1001 に間引く場合は decimate するときれいに間引ける。インターレース解除は yadif、フレーム数の指定でのカットは trim を使う。yadif, trim, decimate, setpts の順番にフィルタをかける。
続きを読む ffmpeg で差分動画を作る