ffmpeg+x264/x265 编码是基于时间而不是基于帧的区域(具有不同的 CRF)?

ffmpeg+x264/x265 编码是基于时间而不是基于帧的区域(具有不同的 CRF)?

x264/5有一个zones参数支持视频各个部分的不同编码设置,但它只接受帧号,而不接受时间戳。

对于恒定帧速率视频来说,这只是一个小麻烦,但对于使用 ffmpeg 过滤器(例如mpdecimate删除(几乎)完全相同的帧)来说,这会带来很大的麻烦。或者对于 VFR 视频来说也是如此。(如果它不适用于ffmpeg,而只是独立 CLI 的一个选项,那么这也会造成很大的不便。)


libx265(和 libx264)有一个 API,允许调用者动态重新配置一些编码器参数,因此 ffmpeg 的 libx264 和 libx265 编码器包装器可以理论上可以在一定范围的时间戳内调整 CRF 或其他编码器参数,与 x264 自己的“区域”功能分开。

ffmpeg 确实有过滤器的开始/停止范围,因此它的命令行/选项解析可能具有处理此问题所需的大部分代码。

但据我所知,此功能目前尚未实现。 ffmpeg -h encoder=libx265没有显示任何相关内容;-x265-params在启动时解析以配置编码器一次,并且仅支持几个其他选项。(libx264有更多的 ffmpeg 选项,但没有我能看到的任何区域。)


是否存在其他编码方式-vf mpdecimate(或任意 VFR 源)并对大部分视频使用 CRF30,但从到00:30:00使用CRF=24 00:30:30,例如?

就我而言,有一个视觉上很有趣的片段,值得花额外的钱来提高质量,我宁愿不把视频切碎,而是使用MKV 有序章节只是为了实现这一点。不过,如果有一些简单的ffmpeg语法可以做到这一点(尤其是一次性完成),那就太好了。我的目标是可以合理地放入 bash shell“一行”中的东西。

要使用区域执行此操作,我认为我需要运行视频mpdecimate并找出该时间区域开始/结束的帧号。我认为我需要通过独立x265CLI 运行视频,因为我认为区域是命令行前端的功能,而不是库本身的功能。(因此不支持通过-x265-params将键/值对传递给 libx265)。

我检查了 Handbrake 是否支持任何类型的区域,但在 GUI 中没有看到它。(Arch Linux 的 Handbrake 1.0.7 软件包仍在使用 x265 2.1,因此它甚至没有更新的 Lambda 表x265 2.4,发布于 9 个月前。Handbrake 很不错,只是它拥有过时的编解码器私人副本,而不是根据系统版本进行构建,这对 x265 来说仍然很重要。)

相关内容