リサイズ、デバンディング、トーンマッピング、色相調整などができる外部ライブラリのlibplacebo
フィルタの使い方。パラメータが多いので一部を抜粋。
- haasn/libplacebo: Official mirror of libplacebo
- Asd-g/avslibplacebo: AviSynth+ libplacebo.
- Lypheo/vs-placebo: libplacebo-based debanding, scaling and color mapping plugin for VapourSynth
基本コマンド
ハードウェア支援なくデコードして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
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
- mpv.io
- User Scripts · mpv-player/mpv Wiki
- bShaders/NoChroma.hook at master · butterw/bShaders
- Video player Shaders guide (MPC-HC, mpv) – Doom9’s Forum
デバンディング。
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
フィルタから使えるのでその使い方。
FFmpeg Filters Documentation : Custom-shaders
shadersの配布先
- bloc97/Anime4K: A High-Quality Real Time Upscaler for Anime Video
- Alexkral/AviSynthAiUpscale: An AviSynth+ implementation of some Super-Resolution Convolutional Neural Networks.
- Releases · igv/FSRCNN-TensorFlow
- GitHub – Artoriuz/ArtCNN: Super-Resolution Convolutional Neural Networks as GLSL shaders for mpv
- GitHub – funnyplanter/CuNNy: Convolutional upscaling Neural Network, yeah!
- MPV_lazy/portable_config/shaders at main · hooke007/MPV_lazy
- GitHub – Artoriuz/glsl-chroma-from-luma-prediction: CfL as a GLSL shader
- mpv-settings/shaders at master · Tsubajashi/mpv-settings · GitHub
- gentoo-conf/home/nand/.mpv/shaders at xor · haasn/gentoo-conf · GitHub
メモ
- アルゴリズムの強さ: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の利用例
- 4Kモニタを使っているならmpvとAnime4Kでビデオを再生しよう
- 最高峰アニメAIアプコン「2x_AnimeJaNai」のV2バージョン遂に登場!! : HD DVDでゴーゴー
- Mathematically Evaluating mpv’s Resampling Algorithms
- 第三方用户着色器 – mpv_CFanStation
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
フィルタを複数回指定して求める結果を探す。