リサイズ、デバンディング、トーンマッピング、色相調整などができる外部ライブラリのlibplaceboフィルタの使い方。パラメータが多いので一部を抜粋。

基本コマンド

ハードウェア支援なくデコードしてyuv420p形式にリサイズする。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=inputs=1:w=1280:h=720:format=yuv420p,hwdownload,format=yuv420p" -c:v libx264 -c:a copy output

NvidiaのGPUがあればデコード支援に使い、こちらの方が速い。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=inputs=1:w=1280:h=720:format=nv12,hwupload_cuda" -c:v hevc_nvenc -c:a copy output

10ビット深度でリサイズする。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=inputs=1:w=1280:h=720:format=p010le,hwupload_cuda" -c:v hevc_nvenc -pix_tmt p010le -c:a copy output

cuda – Understanding pixel format and profile when encoding 10-bit video in ffmpeg with nvenc – Super User

HDRからSDRにトーンマッピングする。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=format=gbrpf32le:color_trc=linear:tonemapping=mobius,libplacebo=format=nv12:colorspace=bt709:color_primaries=bt709:color_trc=bt709,hwupload_cuda" -c:v hevc_nvenc -c:a copy output

mpvのhook shadersを使う。glsl形式は読めない。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=custom_shader_path='C\:/Users/owner/AppData/Roaming/mpv.net/shaders/NoChroma.hook',hwupload_cuda" -c:v hevc_nvenc -c:a copy output

デバンディング。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=format=nv12:deband_iterations=1:deband_threshold=4:deband_radius=16:deband_grain=6:force_dither=1:dithering=0,hwupload_cuda" -c:v hevc_nvenc -c:a copy output

libplaceboフィルタでフィルムグレインを有効にするには、CPUベースのAV1/H.274フィルムグレインの適用を抑制する-export_side_data +film_grainをつける。
ffmpeg -export_side_data +film_grain -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf hwupload,libplacebo=apply_filmgrain=true -c:v hevc_nvenc -c:a copy output

RGBの映像ソースに色情報がないときはcolorspaceフィルタで変換してYUVの動画用に直す。未確認だが外部デバイスからRGBを取り込むときに必要かもしれない。
ffmpeg -hwaccel_output_format vulkan -init_hw_device vulkan=vk -filter_hw_device vk -f lavfi -i colorchart=d=1 -vf colorspace=all=bt709:iprimaries=bt709:itrc=srgb:ispace=bt709:fast=1,hwupload,libplacebo=inputs=1:w=1280:h=720:upscaler=lanczos:format=yuv420p10le:range=tv -bsf:v hevc_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 -c:v libx265 -crf 20 -pix_fmt yuv420p10le -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv output.mp4

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

オプション

ffmpeg -h filter=libplaceboで見られるパラメータ一覧。

以下抜粋。
リサイズアルゴリズムの指定。libplacebo/filters.h · haasn/libplaceboより。

  • upscaler[string]
  • downscaler[string]
    • bilinear, triangle
    • nearest
    • bicubic
    • lanczos
    • ewa_lanczos
    • gaussian
    • spline16
    • spline36
    • spline64
    • mitchell
    • sinc
    • ginseng
    • ewa_jinc
    • ewa_ginseng
    • ewa_hann, ewa_hanning
    • catmull_rom
    • robidoux
    • robidouxsharp
    • ewa_robidoux
    • ewa_robidouxsharp

Best settings for encoding at very low bitrates – Doom9’s Forumより、確かにewa_lanczosをアニメでエンコードしてみたが品質はよさそうだった。ewaはelliptical weighted averagingの略語。

glsl形式のshadersを読み込んでアップスケールする

transcoding – How to use ffmpeg to upscale video resolution with libplacebo? – Stack Overflowより.glslのshadersがffmpegのlibplaceboフィルタから使えるのでその使い方。

shadersの配布先

メモ

  • アルゴリズムの強さ:S < M < L < VL < UL < UUL
  • Deblurはオーバーシュートやリンギングを防ぎ細部をシャープに
  • Restoreはジャギー低減
  • Anime4K_Darkenは線が濃くなり、コントラストが強くなる。Thinと併用する
  • Anime4K_Thinは線が薄くなる。Darkenと併用する。1080pや4Kに有用
  • DTDはDarken-Thin-Deblurの略語
  • AutoDownscalePreはディスプレイ解像度を超える過剰増幅を防ぎ、ダウンスケール処理の追加ステップを回避する
  • Clampは画像のハイライトをクランプ(固定)し、リンギングを防ぎ、オーバーシュートを減らすために使用される
  • GANは一般的にCNNよりも高品質
  • Anime4Kはクロマアップスケールのアルゴリズムを持っていない
  • AiUpscaleはAviSynthのAIアップスケール
  • x2などは等倍率リサイズ向け
  • KrigBilateralはクロマアップスケールに使われ4:2:0、または4:4:4のみに対応
  • 推奨順:Clamp→Restore→Upscale→AutoDownscalePre→Upscale

shadersの利用例

2倍にリサイズする例。10ビット深度にしたほうがきれいに仕上がる。映像に色の情報がついてないときは入力オプションに情報を明示する。.glslファイルはカレントディレクトリに置く。
ffmpeg -hwaccel_output_format vulkan -init_hw_device vulkan=vk -filter_hw_device vk -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -i input -vf "hwupload,libplacebo=w=-2:h=2*ih:custom_shader_path=Anime4K_Upscale_CNN_x2_VL.glsl:format=yuv420p10le" -bsf:v hevc_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 -c:v libx265 -c:a copy -crf 20 -pix_fmt yuv420p10le -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv output.mp4

色の情報の扱いについて
ビットストリームフィルタのまとめ

適宜.glslファイルを指定したlibplaceboフィルタを複数回指定して求める結果を探す。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)