我有幸经历了后 Avisynth 时代,在大家都纷纷转向 Vapoursynth 时,还能感受 LoadPlugin 的魅力。不过话说回来,在越来越讲究高效的快节奏时代,先进的技术必然更受青睐,各行各业都是这样。既然这一天早晚都要来到,为何不提前自学一下 Vapoursynth 呢,同时也可备不时之需,然而我还是太年轻了。
实际上技术的更迭受到多重因素的影响,在我开始自学后才发现过程并不顺利,VS(Vapoursynth)发布已经有三年了,但是相关的教程以及插件并没有出现爆发式增长,似乎大家还是很念旧的,亦或是习惯了懒得改变。总之,种种原因导致 VS 尴尬的现状,但我依然不死心,继续花时间爬帖子,好在上一篇专栏中强调的网站 VCB,提供了完善的新手压制教程:(内容涵盖面广,难度阶梯跨度大)
http://vcb-s.nmm-hd.org/
这个网站不仅涵盖了 VS 压制的教程(教程 06),也包含了许多压制方面的知识,适合作为新手的入门指引,建议大家都去阅读学习一下,另外 VS 官方网站里面有很多插件脚本介绍和下载地址(大部分链接到 github 或者 doom9),有需要的基佬们可以去查找一下:
http://www.vapoursynth.com/doc/pluginlist.html
再补充一个英文的教程网址,里面包含了非常详细的 VS 安装配置与运行教学,出错了也可以在这里寻求解决方案:
http://www.l33tmeatwad.com/vapoursynth101
接下来我将详细讲讲我目前利用 Vapoursynth 进行压制的一套完整的流程:
第零步:下载软件
作为重头的 Vapoursynth 自然是不可或缺的,但是因为他需要用到 Python,所以还需要先配置一个 Python 环境,目前比较好用的 VS 脚本编辑器就是 VapoursynthEditor 了,另外还需要 x265 编码器等等自不必说。
1. Python 3.6 64bit 请使用 3.6 版本
https://www.python.org/downloads/release/python-360/
2. Vapoursynth 64bit
https://github.com/vapoursynth/vapoursynth/releases
3. Vapoursynth Editor 64bit vpy 编辑器
https://forum.doom9.org/showthread.php?t=170965
- x265.exe 下 MeGUI 里编译好的版本即可
或者自行编译 http://ftp.videolan.org/pub/videolan/x265/
- 一些 bat 和 VS 插件以及脚本
第一步:安装软件
首先进行 Python 3.6 64bit 的安装,组件全部安装即可,注意勾上 Add Python to environment variables,不然得自己手动添加。此时注意自定义安装路径,默认是在用户文件夹下的 AppData 内,尽量不要更改,不然 UAC 会频繁弹出是否允许程序修改内容,当然关闭 UAC 的用户就没关系了。
接下来就是进行 Vapoursynth 的安装了,过程也很简单,根据需要改变路径或者选项,只是别忘了具体路径,之后会用到。
Vapoursynth Editor 是绿色版,直接放文件夹里就行了,最好关联一下. vpy 后缀的文件
x265 之类的建议直接安装一个 MeGUI x86 版,可以很方便的地提供各种插件的更新和管理,不用再一个一个去搜索下载了。如果想自己单独下载,可以去这个网站找到:
http://msystem.waw.pl/x265/
第二步:配置环境
仅仅安装完软件是远远不够的,还有许多脚本和插件需要配置,这一步我之前研究了很久,最后发现默认安装路径下的 site-package 文件夹才是正确的路径,饶了些弯子,不过还是回归了正道。如果是默认安装路径,将 Vapoursynth 压缩包内文件夹覆盖到一下路径:
C:\Users\(用户名)\AppData\Local\Programs\Python\Python36\Lib\site-packages\vapoursynth
之后基本的一些脚本就配置好了,接下来需要添加一些必要的插件到 Vapoursynth 的安装路径,将 plugins64 压缩包内的文件放到同名文件夹内,默认路径为:
C:\Program Files (x86)\VapourSynth\plugins64
接下来就可以打开 vseditor 尝试能否正常使用了,如果提示找不到插件文件夹之类的错误,请按对应位置把路径添加进 vseditor:
打开 vseditor 的 settings,进入 path 页面,然后将红线部分对应自己安装 VS 位置的路径添加进去。我因为使用 vapoursynth 最新版,默认安装在 AppData 下面,而之前版本应该在 Program Files (x86) 文件夹下。
第三步:配置脚本
这里提供一个网络搜集来的基本脚本,包含了一些基础的功能,代码下方为对应的说明:
**import vapoursynth as vs**
**import sys**
**import havsfunc as haf**
**import mvsfunc as mvf****core = vs.get_core(accept_lowercase=True,threads=8)**
**#接受小写以及设定线程数****core.max_cache_size=8000**
**#最大使用缓存(内存)****Source=r'E:\EXPORT\Video.mp4'**
**#源文件地址**
**src=core.lsmas.LWLibavSource(Source,threads=1)**
**#载入源滤镜**
**src=core.std.SetFrameProp(src,prop="_FieldBased",intval=0)
#设定扫描模式
#trim=core.std.T****rim(res,0,100)**
**#切割 0 到 100 帧(普通写法)****#video=clip[0:101]**
**#切割 0 到 100 帧(语法糖)****#cropped=core.std.CropRel(clip=src,left=0,right=0)**
**#裁剪视频****#res=core.Resize.Spline36(clip=cropped,width=1920,height=1080)**
**#缩放视频****#longvideo=video1+video2+video3**
**#合并视频(语法糖)****#longvideo=core.std.Splice([video1,video2,video3],mismatch=1)**
**#合并视频(普通方法)mismatch 时也强行合并****BM3D=mvf.BM3D(src,sigma=[3,3,3],radius1=0)**
**#降噪****#dbed=core.f3kdb.Deband(src,12,32,24,24,0,0)**
**#去色带****#ass=core.assvapour.AssRender(dbed,"xxx.ass")**
**#加字幕****BM3D.set_output()**
**#输出视频流**
这里对脚本就不进行详细的解释了,如果需要理解代码的可以参考 vcb-s.nmm-hd.org 内的教程。我用 “#” 号注释掉了大部分内容,因为我并不需要切割缩放视频,而且字幕也习惯封装到 mkv 内,所以只保留了一个降噪的功能。脚本内线程数,内存,文件地址根据实际情况更改。
填写好正确的视频路径之后,点击菜单 Script 下的 Preview(F5)可以进行预览,此时极有可能会报错,根据错误提示进行修正即可。(语法出错等问题可以参考 https://vcb-s.nmm-hd.org/Templar%20Archive/ 网站上的教程 06)没问题的话会弹出一个视频预览框,可以拖动时间轴查看处理后视频,确认没问题以后,即可准备压制。
第四步:开始压制
这一部分的中心思想就是利用 vspipe 将视频流 pipe 到 x265,然后压制输出视频,整个过程利用 bat 实现。(win 平台下用 bat,mac 平台下用 sh)其中核心压制命令行为:
"C:\Program Files (x86)\VapourSynth\core64\vspipe.exe" --y4m "PreFlow.vpy" - | "C:\Program Files (x86)\MeGUI\tools\x265\x64\x265.exe" --y4m --preset slow --frame-threads 18 --crf 21 --deblock 0:0 -D 10 --merange 44 --aq-strength 0.8 --qcomp 0.65 --output "D:\Media\TEMP\%~n1.hevc" -(最后的 “-” 不能忘了)
蓝色部分为可选的压制参数,可以根据自己的需要修改,参考文档:
https://x265.readthedocs.io/en/default/cli.html
而黑色的部分是必要的内容,包括 vspipe.exe 以及 x265.exe 的位置,vpy 文件的位置,还有选择 y4m 格式作为中间流,最后则是 output 文件的位置。
修改好. vpy 内文件路径后将. vpy 拖至 bat 即可开始压制,测试成功后可以发展一下自动化,只需要将视频拖至 bat,会自动生成. vpy(因为我压制时参数基本一样,所以可以使用固定的 bat,如果个人需要也可以动态生成代码),之后 bat 根据设置的 x265 参数开始压制生成. hevc 文件在指定路径。
另外补充一个重点,直接将文件拖上 bat 压制时会报出 utf-8 code can‘t decode 错误,因为文件路径或者名称含有 utf-8 的字符,而 cmd 的默认代码页不是 utf-8 的,所以会产生乱码,这时候需要进行一些设置将 CMD 的默认 code page 改成能够识别中文的。一种办法就是进入注册表,计算机 \ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor 下添加一个字符串值,名称为 autorun,内容为 chcp 65001,之后运行 CMD 就会自动转换代码页为 utf-8 了。
分享一下我使用的 bat 文件,可以根据自己需求更改:(x265d10.bat@2017/10/20)
**@ECHO OFF & CD/D "%~dp1"**
**echo import vapoursynth as vs > "%~dpn1.vpy"**
**echo import sys >> "%~dpn1.vpy"**
**echo import havsfunc as haf >> "%~dpn1.vpy"**
**echo import mvsfunc as mvf >> "%~dpn1.vpy"**
**echo core = vs.get_core(accept_lowercase=True,threads=14) >> "%~dpn1.vpy"**
**echo core.max_cache_size=8000 >> "%~dpn1.vpy"**
**echo Source=r'%~dpn1%~x1' >> "%~dpn1.vpy"**
**echo src=core.lsmas.LWLibavSource(Source,threads=1) >> "%~dpn1.vpy"**
**echo src=core.std.SetFrameProp(src,prop="_FieldBased",intval=0) >> "%~dpn1.vpy"**
**echo BM3D=mvf.BM3D(src,sigma=[8,0,0],radius1=0,profile1="lc") >> "%~dpn1.vpy"**
**echo BM3D.set_output()>> "%~dpn1.vpy"**
**Echo Building File Index......**
**"C:\Program Files (x86)\VapourSynth\core64\vspipe.exe" --y4m "%~dpn1.vpy" - | "C:\Program Files (x86)\MeGUI\tools\x265\x64\x265.exe" --y4m --preset slow --frame-threads 7 --crf 21 --deblock 1:0 -D 10 --merange 44 --aq-strength 0.8 --qcomp 0.65 --output "D:\Media\TEMP\%~n1.hevc" -**
**Echo **
**ping 127.0.0.1 -n 1 >nul**
**mshta vbscript:createobject("sapi.spvoice").speak("Job done!")(window.close)**
**Echo Press [Space] to delete TEMP files**
**pause**
**del "%~dpn1.vpy"**
**del "%~dpn1%~x1.lwi"**
**Echo done!**
**pause**
第五步:封装视频
经过漫长的等待,压制流程结束了,得到了一个 hevc 文件。接下来我会利用 MKVToolNix 工具分离原文件的音频字幕章节之类的信息,然后和压制后的 hevc 文件封装到一起。(也可以用 mp4box,ffmpeg 之类的 mux 成 mp4)因为工具自带中文,所以应该很容易上手,最新版可以从这里下载:
https://www.fosshub.com/MKVToolNix.html
第六步:一些思考
最近压制一些老电影时经常遇到一些错误,不合理的 pack 方式,缺失音频信息等等,导致音画不同步甚至压制失败,几个小时的工作也就白费了,以后想研究一下视频修复的办法,让压制之路更加顺畅。