VapourSynth API4 体验

2021 年 9 月下旬,VapourSynth 发布 R55 版本,从这一版本开始使用 API4。API4 的启用使大量脚本需要更新,一些滤镜似乎也需要做相应的适配。同时,由于大版本的升级和滤镜开发的迁移,配套的 IDE、对应的 Python 版本都需要关注一下。

脚本 API4 适配

常见的 API 替换:

  • core = vs.get_core()
    -> from vapoursynth import core
    -> core = vs.core

  • 色彩空间 YCoCg 和 COMPAT 系列被弃用

  • 内置函数的更新
    比如 AverageFrames()misc 迁移到 std

  • 命名规则中 _ 从后缀变为前缀,避免和 Python 变量名冲突
    比如lambda_改为_lambda

在调试中遇到过如下报错

1
analyse: function does not take argument(s) named _global

可能是后缀变前缀,但滤镜没有适配导致的。后来直接升级 VapourSynth 和 Python 大版本就没有这个问题了。

滤镜 API4 适配

新版 API 对滤镜的影响有限,除了 Histogram 外暂时没有遇到因为 API 更新导致不可用的问题(也可能是我没注意到)。不过 API4 启用后不止一个滤镜发布了更新,稍稍关注一下。比如 fmtconv 久违近两年,连续发布多个更新。

一些 API 的变化:

  • 变量类型:

    • VSFrameRef -> VSFrame
    • VSFormat -> VSVideoFormat
  • 函数(prop -> map

    • propGetNode() -> mapGetNode()
    • propSetInt() -> mapSetInt()

官方 Doc 似乎还没有完全更新,没事看看 vsapi.cpp 总是好的。

依赖索引

  • VapourSynth Organization 增加了数个滤镜,把一些滤镜从 VapourSynth 本体中剥离了出来。

    部分滤镜指路:

  • 越来越多的脚本放到了 Python Package Index(PyPI)上,所以动手前先试一下pip install xxx不是个坏主意。

IDE:从 VSEditor 到 VSEditor2

我的 VSEditor 很久之前失去了语法高亮,时间太久想不起来当时搞了什么操作。删了重下、重装 VapourSynth 都无济于事。D9 论坛上提到删除 xx.config,但我这是 Windows 系统啊…

环境配置

顺势改用 VSEditor2。VSEditor2 目前更新到 R6.5。其中,R6.5 版本需要 LibP2PAkarinVS/vapoursynth-pluginHistogram。R6.4 及之前的 R6.x 版本不需要后两者。

但我在使用 R6.5 版本时 VSEditor2 发生崩溃,怀疑与 Histogram 有关。Histogram 在适配 API4 后未发布相应版本,并且似乎没有完全适配,简单改了代码编译后 VSEditor2 仍然崩溃。幸好 VSEditor2 的作者做了相应适配(gundamftw/vapoursynth-histogram),R6.5 版本顺利运行。

应该说 VSEditor2 正处于开发阶段,加上新版 VapourSynth API 的启用可能引发潜在的问题,遇到问题多看看作者的帖子是值得的。

功能与界面

基本的功能都和 VSEidtor 保持了一致,右侧的工具栏提供了一些方便的小工具,比如单独查看 Y、U、V 各个平面,裁剪助手等,预览界面下方的进度条也让查找视频内容更加便捷。总之增添了不少人性化的细节。

但不得不吐槽一句,把预览界面和代码界面放到同一个窗口,取消原来单独的预览窗口,真是对小屏幕太不友好了。

Python 版本升级

截至目前,最新版的 VapourSynth R58-RC2 仅适配 Python 3.10.x 版本和 Python 3.8.x 版本。

在调用脚本时遇上一个报错。

1
'ABCMeta' object is not subscriptable

当时环境为 VapourSynth R57 + Python 3.8。这似乎是一个蛋疼的语言问题,直接升级版本到 VapourSynth R58-RC2 + Python 3.10,之后相安无事。