大韓民国観察記Neo

韓国の、どうでもいい、重箱の隅をつつくブログ。

ffmpeg 無料でデブロック

システム:Fedora29、Fedora30
インストール方法:#dnf install ffmpeg
(rpmfusion-free,rpmfusion-nonfreeのリポジトリー登録が必要)
Fedoraだとrpmfusionにパッケージがあるからいいけど、他のディストリビューションでは、コンパイルしなければならないからたいへん。

f:id:sirius-B:20191211011349p:plain

デブロックの概要

そもそも手間暇かけて、デブロックしようなんて意欲が起きる動画は、そうそうない。
それでもデブロックして、映像を改善したいときは確かにある。

そうそうないケース・・・その1
youtube動画を種々の他人には言えない方法で強引にダウンロードした場合。
ブロックノイズはyoutubeに動画をアップードした時に、youtube側の大人の事情で、画像が劣化してできることが多い。

そうそうないケース・・・その2
まっとうではない動画(主にポルノ)を種々の他人には言えない方法で強引にダウンロードした場合。
人気のある動画の映像ソースが、コピーを重ねて映像が劣化したVHSビデオなんていうケースはよくあって、これが高圧縮でアップロードされたら、ド派手にブロックノイズが乗っかってしまい、640×480dpiのNTSCの標準解像度すらまともに出ていない場合もある。

市販のデブロック対応ソフトは、さすが、使う人の足元を見た価格設定をしているだけあって、お高いものが多い。
最低10万円〜というのも、えげつないお値段。
しかも、効果はというと、金返せというレベルの物も多いから、デブロック業界は、新宿5丁目のぼったくりバーレベルの危険な業界といっても過言ではない。

ただし、デブロック業界を弁護するとしたら、そもそも動画のデブロックという作業は超絶難しい作業だということ。
一昔前なら、Silicon Graphicsの1台1千万円はするワークステーションで、1ライセンス1千万円はするソフトを使ってやっていた作業。
これが最低10万円〜というのは、超絶ディスカウント価格であることは間違いない。

しかし、国際レベルのハッカー様の大部分は精力絶倫な男の子。
まっとうではない動画(主にポルノ)を種々の他人には言えない方法で強引にダウンロードして、自分の欲望を満たしたいと思うもの。
そこに付け込んでボッタクる奴らは許せないとばかりに、決して万人向けとは言えないものの、タダでデブロックする手段をffmpegに実装しちゃったというのが今回のお話。

デブロックの原理は、故意にブロックノイズを発生させ、デブロックしたい動画に合成し、ブロックノイズと干渉させて、ブロックノイズを相殺するというもの。
当然、故意に発生させるブロックノイズが、デブロックしたい動画のブロックノイズのパターンときちんと合っていなければいけない。
この調整は、きちっとやろうとすれば、自動でできるほど簡単なものではなく、そのぶん、オプションパラメーターは複雑なものになっている。
雑でもよいなら、下にあるコマンドを参考とされたい。

なお、メモリーはそれほど喰わないが、CPUパワーは超絶に喰うので、非力なマシーンだと見た目フリーズ状態になる。
10分くらいの短い動画でも、3GHzシングルコアなら、24時間以上処理にかかるケースもある。
御注意あれ。

 

(普)いちばんバランスがよい(命令は1行で入力する)
ffmpeg -i input -vf deblock=filter=1:block=8:alpha=0.098:beta=0.05:gamma=0.05:delta=0.05:planes=15 output

(強)参考(命令は1行で入力する)
ffmpeg -i input -vf deblock=filter=strong:block=4:alpha=0.12:beta=0.07:gamma=0.06:delta=0.05:planes=15 output


オプション(全部ではない。私がわかる範囲で書いている)

filter[int]
フィルタータイプの指定
0, weak
1, strong:既定値
block[int]
ブロックサイズの指定。小さい値ほどデブロック効果が高い
既定値:8
範囲:4 から 512 まで
alpha[float]
ブロック検出の閾値の指定。大きい値ほど強度が増す
既定値:0.098
範囲:0 から 1 まで
beta[float]
以下2つはエッジ付近の閾値検出を制御する。それぞれ下/上または左/右。0 を指定すると無効になる
既定値:0.05
範囲:0 から 1 まで
gamma[float]
同上
delta[float]
同上
planes[int]
フィルタを当てるチャンネル指定
詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
ちなみにこれの覚え方があって二進法で各チャンネルのオンオフを決めている。1111(2) ならば4チャンネルすべてが有効化される。つまり 1 x 2^3 + 1 x 2^2 + 1 x 2^1 + 1 x 2^0 = 15 で表される。他の例では1番目と3番目のチャンネルを有効にするには 0101(2), 0 x 2^3 + 1 x 2^2+0 x 2^1 + 1 x 2^0 = 5 で 5 をオプションで指定する。