SVP 是一个不错的视频插帧工具,可以通过详尽的参数设定处理出适合自己的高帧率视频。
目前,SVP 的主要版本是 SVP4。
本次主要记录的是使用 SVP4 配合视频压制工具制作高帧率视频的过程。
本文于 2017-09-07 最后更新,加入了 VapourSynth 的具体脚本。
需用用到的工具是 SVP4 以及 MeGUI,压制的话使用 x264 或 x265 也是可以的,这不影响最后的成品输出。当然,你必须有一个支持 SVP4 的播放器,推荐使用 PotPlayer。
SVP4的下载地址:https://www.svp-team.cn.com/wiki/Download
MeGUI的下载地址:https://sourceforge.net/projects/megui/files/megui-stable/
x264的下载地址:https://www.nmm-hd.org/newbbs/viewtopic.php?f=8&t=219
x265的下载地址:https://www.nmm-hd.org/newbbs/viewtopic.php?f=8&t=1592
VapourSynth下载地址:https://github.com/vapoursynth/vapoursynth/releases
配置 MeGUI 或 x264 或 x265 使用的参数参见:http://vcb-s.nmm-hd.org/Dark%20Shrine/
以下为 AviSynth 搭配 SVP4 使用方法
首先第一步是安装 SVP4。
安装时注意,如果你的机器未安装有 AviSynth,请务必勾选相关选项。
一般勾这些选项就好了:
第二步是在播放器里配置好 SVP,以便自己调整效果。
配置方法很简单,打开 PotPlayer 的参数选项,在 滤镜 选项卡中找到 全局滤镜优先权,然后在右侧按钮里找到 添加系统滤镜,然后找到 ffdshow raw video filter 并调整按下 强制使用。
这时候默认视频就会被 SVP 处理了。
第三步是找到并复制 SVP 使用的 AviSynth 脚本。
在播放视频窗口右键,找到 滤镜 选择 ffdshow raw video filter 并点击。
可以在弹出窗口的左侧选择 AviSynth,于是可以在右边的红框中看到当前脚本所在位置。
第四步是修改 SVP 的 AviSynth 脚本
修改的地方有以下几点:
第一点是以下两句:
LoadPlugin("D:\Program Files (x86)\SVP 4\plugins64\svpflow1.dll")
LoadPlugin("D:\Program Files (x86)\SVP 4\plugins64\svpflow2.dll")
出现的问题是,MeGUI 默认的 AviSynth x86 不支持 64 位的滤镜,会出现加载错误。
这一点要看情况,如果你使用的工具支持 64 位的 AviSynth 滤镜,那么可以保留这两句。
一般需要调整的话,是改为如下两句
LoadPlugin("D:\Program Files (x86)\SVP 4\plugins\svpflow1.dll")
LoadPlugin("D:\Program Files (x86)\SVP 4\plugins\svpflow2.dll")
第二点是以下几句:
SetFilterMTMode("DEFAULT_MT_MODE",2)
SetFilterMTMode("SVSuper",1)
SetFilterMTMode("SVAnalyse",1)
SetFilterMTMode("ffdshow_source",3)
ffdshow_source()
ConvertToYV12()
前四句处理时会提示错误。
替换为两句如下即可:
SetMTMode(3,threads)
SetMTMode(2)
后两句是 SVP 使用的视频源是 ffdshow 提供的,而我们导入视频源需要使用效果性能更好的源滤镜。
一般以下两行中选择一行替换掉存在问题的两行即可,
其中 xxx.mp4
是脚本同目录下待处理视频文件的名称。
LWLibavVideoSource("xxx.mp4").ConvertToYV12()
FFVideoSoure("xxx.mp4").ConvertToYV12()
第三点是以下一句:
Prefetch(threads)
删掉这一句就好。
第五步或者说最后一步,是把 AviSynth 脚本投入压制或扔给 VapourSynth 进行处理。
VapourSynth 安装时勾选 PISMO,即可以通过 VapourSynth\core64
目录下的 avfs.exe
将 AviSynth 脚本转化为虚拟文件。
这个虚拟文件的位置一般在 C:\Volumes
至于怎么在 VapourSynth 里导入文件,可以参考 VapourSynth 的文档,此处不赘述。
如果是导出到 x264 、x265 压制。
使用 ffmpeg 将视频 pipe 到 x265 的例子(省略压制参数):
ffmpeg -i source.avs -f rawvideo -an -v 0 - | x265.exe
至于 MeGUI 那就更不用说了,把 AviSynth 脚本拖进主界面的 AviSynth script 框就导入完成了。
额外的废话:
本身 SVP 的速度是很快的(毕竟是实时处理滤镜),但是压制选用消耗大量性能的滤镜或参数会大幅度降低速度。请不要把锅甩给 SVP。
另外,SVP免费版的内处理是8bit位深的,嫌弃就买专业版吧。
以下为 VapourSynth 搭配 SVP4 的使用方法
首先是安装配置运行环境:
安装 Python 及 VapourSynth。
需要注意的是,要在 VapourSynth 中使用完整的 SVP4 滤镜,需要两个 DLL:
svpflow1_vs.dll
svpflow2_vs.dll
可以在 SVP 4\plugins64
目录找到,然后拷贝到 VapourSynth\plugins64
文件夹使用。
不同于免费版自带 AviSynth 滤镜,这俩是不包含在免费版里的。
所以这里给一下截止到 SVP4 Pro 4.1.0.118
版本最新的滤镜,这里下载
(印象里是不依赖 SVP4 本体的,但还是建议买个正版)
需要特别 注意 的是,如果你的 PotPlayer 在 SVP4 的 Native 模式下使用 VapourSynth 渲染,
请不要把这俩 DLL 放进 VapourSynth\plugins64
文件夹,麻烦每次写脚本手动定位加载位置:
core.std.LoadPlugin("PATH TO SVP4/plugins64/svpflow1_vs.dll")
core.std.LoadPlugin("PATH TO SVP4/plugins64/svpflow2_vs.dll")
然后是关键的压制脚本:
官方给的滤镜文档在这里,然后看得有点吃力就渣翻了一部分放在这里,里头也有一个完整的例子。
稍微改了一点点,用来把片源插帧到 120fps:
import vapoursynth as vs
core = vs.get_core(threads=9)
# 把这俩 DLL 拷贝到 VapourSynth\plugins64 先
#core.std.LoadPlugin("svpflow1_vs.dll")
#core.std.LoadPlugin("svpflow2_vs.dll")
sourcename = "input.mp4"
clip = core.lsmas.LWLibavSource(sourcename)
clip = clip.resize.Bicubic(format=vs.YUV420P8) #convert to YV12
# 运动向量精度 0.5 像素
# 使用 GPU 渲染
# 放大使用 Wiener interpolation(类似 Lanczos 6tap)
# 缩小使用类似 BicubicResize(b=1,c=0) 的 cubic filter
super = core.svp1.Super(clip,"{scale:{up:2,down:4},pel:2,gpu:1}")
# 使用 GPU 渲染
# 搜索的运动矢量的方向时包含前向后向
# 搜索的块大小 = 32x32 每个方向重叠四分之一个块
# 精细搜索使用彻底搜索
# 粗略搜索使用六边形搜索
vectors= core.svp1.Analyse(super["clip"],super["data"],clip,"{gpu:1,vectors:3,block:{w:32,overlap:2},main:{type:4,search:{coarse:{type:2,distance:-4,bad:{sad:2000,range:24}}}},refine:[{thsad:250}]}")
# 渲染算法 =
# 时间加权之下混合前向和后向部分运动向量补偿 +
# 额外的遮罩减小光晕提升物体边缘线条质量 +
# 额外的运动向量进一步减少光晕
# 帧插补 = 自动判断
smooth = core.svp2.SmoothFps(clip,super["clip"],super["data"],vectors["clip"],vectors["data"],"{gpuid:21,rate:{num:120000,den:1000,abs:true},algo:2,mask:{area:100},scene:{mode:3}}")
smooth = core.std.AssumeFPS(smooth,fpsnum=smooth.fps_num,fpsden=smooth.fps_den)
smooth.set_output()
把脚本跑起来压制:
使用 vspipe
读取并 pipe 到 x264
,参数来自 VCB-S 教程模板:
vspipe.exe --y4m vs.vpy - | x264-8bit-x86_64-full.exe --demuxer y4m --preset veryslow --crf 16.5 --threads 8 --deblock -1:-1 --keyint 600 --min-keyint 1 --bframes 8 --ref 13 --qcomp 0.75 --rc-lookahead 70 --aq-strength 0.8 --me tesa --psy-rd 0.6:0.15 --no-fast-pskip --aq-mode 3 -o "output.h264" -
觉得上边的太慢,可以试试用最快的 ffmpeg
跑 NVENC (画质惨不忍睹,建议只用来压在手机上看的 720P可是那还有什么意义呢):
vspipe.exe --y4m vs.vpy - | ffmpeg -i pipe: -c:v h264_nvenc encoded_nvenc.h264