预览缩放
引言(Introduction)
预览缩放(preview scaling)是指以一种视频分辨率进行合成(compose),然后以较低的分辨率进行查看的能力。这样做的目的是为了解决性能上的不足——这些不足会导致大量丢弃视频帧,或者在禁用丢帧时(参见消费器的 real_time 属性)使播放速度远低于实时。例如,在 2020 年,只有高性能计算机才能在软件经过良好优化的情况下,以适度的视频特效处理 4K UHD 60 fps。同时,MLT 的许多视频特效尚未优化。这种缓慢妨碍了在预览时验证预期结果的能力。然而,如果你能以 960x540 分辨率播放同一个合成,那么它就能以更高的帧率播放——非常接近实时。
预览缩放能力在很多特效中已经存在了很长时间,但直到 6.20.0 版本它才真正得到支持。即便如此,如果你使用外部的 MLT 模块,或未经验证/未测试过的 frei0r 或 avfilter,那么它在某些特效上可能无法按预期工作。
请注意,某些特效如果无法支持预览缩放,可能会选择抑制它。例如,时至今日,所有双通道(dual pass)的 MLT 视频稳定滤镜都会禁用它,因为它的变换数据是基于全分辨率的,并且它选择不尝试对变换数据进行缩放。
Melt 与 XML 用法
要在 melt 中使用此功能,请在消费器上添加一个名为 scale 的属性。这可以在命令行的 -consumer 选项上完成,也可以在 MLT XML 内部的 <consumer> 元素上完成。该属性接受一个缩放因子,它将与配置文件(profile)分辨率的每一个维度(宽、高)相乘,以决定预览分辨率。例如,如果配置文件(显式指定或自动检测)给出 1280x720 的分辨率,而你设置 scale=0.5,那么预览分辨率将会是 640x360,即全分辨率的 25%(0.5 * 宽 * 0.5 * 高 = 0.25 * 宽 * 高)。
注意:multi 消费器不支持预览缩放。
应用开发者
作为应用开发者,在消费器上设置 scale 属性既非必要也无助益(除了将 melt 作为子进程运行和/或生成 MLT XML 的情况)。相反,你需要使用两个 配置文件(profile) (opens in a new tab)对象。用一个配置文件对象来构建或加载合成的图(graph)(生产器 producers、滤镜 filters、转场 transitions、tractor)。该配置文件应具有合成的完整分辨率。然后,再创建一个处于预览分辨率的配置文件对象,并用它来构造消费器。如果你需要更改预览配置文件,那么你必须停止并重启消费器。另外,你也可以在不重启消费器的情况下在消费器上设置宽和高属性,但你仍应为一个单独的消费器使用一个独立的配置文件,因为设置这些属性也会更新消费器自己的配置文件。
强烈建议对宽和高使用相同的缩放因子,因为某些特效(例如 frei0r 和 avfilter)并不确切知道某个参数究竟应当使用宽还是高,只会任选其一——通常是宽的缩放因子。同样强烈建议宽是 2 的倍数,以避免那些工作在 YUV 4:2:2 下的特效在半采样色度(subsampled chroma)上出现问题。相应地,如果你打算通过 avformat 编码进行预览并且你的 pix_fmt 是 yuv420p(最常见),那么对于逐行扫描高应当是 2 的倍数,对于隔行扫描高应当是 4 的倍数。
MLT 开发者
如果你的某个参数接受像素值,那么该值对合成(当前的 MLT 对象图)的分辨率是敏感的,合成分辨率用一个 mlt_profile 来表示。在这种情况下,你需要将像素值缩放到预览分辨率。
如果所有特效参数都使用相对的、与分辨率无关的度量单位——例如用百分比代替像素——那么通常几乎无事可做,多数 frei0r 就是这种情况。然而,有些东西已经实现为接受像素值。在这种情况下,现有参数不能被更改,以免破坏现有的应用和合成。可以添加新参数,但把现有的像素值转换为相对于合成分辨率的比率,能在不影响应用的情况下达到同样的目标。
消费器在调用 mlt_frame_get_image() 时使用它自己的宽和高属性。从滤镜、转场或生产器的视角看,这些被称为请求宽和请求高(request width and height),它们出现在特效的 get_image 虚函数的参数中。如果你简单地取请求宽与配置文件宽的比值,就能得到一个可应用的缩放因子。为了让这稍微更便捷、更可维护,加入了函数 mlt_profile_scale_width() 和 mlt_profile_scale_height()。
WebVfx
WebVfx 在 1.2.0 版本中已更新以支持预览缩放。然而,当与 WebVfx JavaScript 扩展一起使用 QML 或 HTML 时,必须格外小心。当使用纯 HTML(不带 WebVfx JavaScript 扩展)时,WebVfx 会自动使用浏览器缩放,按 MLT 的宽缩放因子进行缩放。否则,HTML/QML 的脚本必须将属性 mlt_resolution_scale 设置为值 1 才能进行预览缩放。若缺少此项,webvfx 会为帧上的所有滤镜禁用预览缩放。脚本可以通过使用 WebVfx JavaScript 扩展的 getNumberParameter 来查找名为 mlt_profile_scale_width 和 mlt_profile_scale_height 的属性,从而获取当前的缩放因子以缩放其参数。