ゲーム配信などでレイアウトを決めるときに映像が全く変わらない部分。例えばRTAのチャートの部分とか、レトロゲームを模したフレームとかそういったところの品質を下げると他の部分で使えるビットレートが増えて全体の品質が向上する。対応コーデックは H.264、H.265、VP8、VP9 など。
Encode/H.264 – FFmpeg
Encode/H.265 – FFmpeg
VP9(libvpx-vp9)のエンコード設定について
新しい映像の品質評価 libvmaf
基本コマンド
左上0:0座標から右と下に100ピクセルの領域に0.2品質を悪くする。
ffmpeg -i input -vf addroi=x=0:y=0:w=100:h=100:qoffset=1/5 -c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:a copy output
ffmpeg -i input -vf addroi=0:0:100:100:1/5 -c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:a copy output
2回フィルタを当てれば2カ所の品質を変えられる。以下の例は左3分の1の品質を0.5良くし、右3分の1の品質を0.5悪くする。
ffmpeg -i input -vf addroi=0:0:iw/3:ih:-1/2,addroi=2*iw/3:0:iw/3:ih:1/2 -c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:a copy output
コーデック別のオプション例。VP9 はROI is only enabled when aq_mode is 0, cpu_used >= 5 and deadline is REALTIMEとなるので以下のようになる。-crfで品質指定しビットレート固定して品質の比較をしやすくしている。厳密にビットレートをそろえるなら2パスエンコード-pass 1、2するが VP8 は-crfが使えず、VP9 は-quality realtimeで2パスエンコードができない。
-c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:v libx265 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:v libvpx -crf 25 -b:v 800k -bufsize 800k -minrate 800k -maxrate 800k -c:v libvpx-vp9 -aq-mode 0 -cpu-used 5 -quality realtime -crf 25 -b:v 800k -bufsize 800k -minrate 800k -maxrate 800k
公式ドキュメント:FFmpeg Filters Documentation : addroi
オプション
領域指定はぴったりの範囲ではなく16の倍数で目的の範囲より一回り小さい値を指定する。qoffsetの値は映像のビット深度で品質指定crfの影響が異なり、10bit深度なら 51 から -12 までの範囲である(51 – – 12)の 63 を 1 とし、8bit深度では 51 から 0 までの範囲の (51 – 0)の 51 を 1 とする。単色で全く映像が変わらないならqoffset=1でよいが、色が複雑なら 0.2 くらいから調整してみる。
- x[string]
領域指定の横座標 - y[string]
領域指定の縦座標 - w[string]
指定範囲の横のピクセル数 - h[string]
指定範囲の縦のピクセル数 - qoffset[rational]
品質指定のオフセット値。マイナスほど高品質大容量
既定値:-1/10
範囲:-1 から 1 まで - clear[boolean]
このフィルタの効果を打ち消す
既定値:0