如何在FFmpeg中用libplacebo调用Anime4K实现纯超分及GLSL改帧率?
一、关于GLSL算法修改帧率的说明
首先明确:Anime4K是超分辨率/画质增强算法,不负责帧率转换。帧率转换属于时间轴处理(如帧插值补帧),而GLSL着色器大多专注于空间域的像素处理。
如果需要用GLSL实现帧率转换(如补帧),需使用专门的时间域GLSL着色器(部分补帧算法有GLSL版本),但FFmpeg的libplacebo滤镜对时间域Shader的支持有限——这类Shader需要访问多帧数据,实现起来较为复杂。目前更实用的方式是:先通过FFmpeg的帧插值滤镜(如minterpolate)生成目标帧率的帧,再用libplacebo加载GLSL着色器做画质增强;若有支持时间域的GLSL Shader,需确保libplacebo配置正确的帧缓存。
二、Anime4K超分的正确调用方式
1. 为何不加w/h参数分辨率不变?
直接使用libplacebo=custom_shader_path=Anime4K_Upscale_CNN_x2_VL.glsl时,Anime4K的x2 shader确实会输出2倍分辨率,但libplacebo默认会将输出画面缩回到输入分辨率,因此最终视频尺寸不变。GPU占用上升是因为Shader确实在运行,只是结果被缩放回原尺寸了。
2. 是否会先运行libplacebo内置超分再执行Anime4K?
不会。只要你没有额外配置libplacebo的内置缩放/超分参数(如scale相关选项),指定custom_shader_path后,滤镜只会运行你提供的GLSL着色器,不会触发内置超分算法。你看到的超分效果就是Anime4K直接输出的结果。
3. 修正你的Python命令
你的命令中filter_complex里的libplacebo参数存在重复错误(custom_shader_path=libplacebo=custom_shader_path=...),正确的命令如下:
[ 'ffmpeg -hide_banner', '-hwaccel', 'cuda', '-i', '"{input_ab_path}"', '-filter_complex', '"[0:v]libplacebo=w=iw*2:h=ih*2:custom_shader_path=shaders/Anime4K_Upscale_CNN_x2_VL.glsl,subtitles="{sub_file}":si=0[out]"', '-map', '0:a', '-map', '"[out]"', '-c:v', 'libsvtav1', '-svtav1-params', 'scm=2:scd=1:enable-overlays=1:enable-tf=0:tune=0:preset=7:crf=18', '-c:a', 'libvorbis', '-qscale:a', '10', '-pix_fmt', 'yuv420p10le', '-y', '"{output_ab_path}"' ]
这样配置后,libplacebo会按照Anime4K shader的输出尺寸(2倍原分辨率)输出画面,完全由Anime4K完成超分,无内置算法干扰。
补充说明
- 若需同时处理帧率转换和Anime4K超分,建议先完成帧率转换(如
minterpolate=fps=60),再串联libplacebo加载Anime4K shader。 - 确保FFmpeg已正确编译
libplacebo支持,且GLSL shader文件路径正确(相对路径需对应FFmpeg运行的工作目录)。
内容的提问来源于stack exchange,提问作者Ironbox

