FFMS2 提供对多个视频编解码器的帧精确访问。但是当我们做长距离的跳帧访问时它很慢。
是什么实现了快速跳帧访问,或者像 VLC 这样的现有视频播放器如何实现这一点?
视频播放器使用合并到视频文件中的时间到文件位置索引。当您导航到某个时间码时,播放器会读取该索引,找到之前的关键帧,解码找到的关键帧和对应于请求的时间码的帧之间的所有帧,然后显示它。在大多数情况下,要获得该帧需要做很多额外的工作,这就是为什么 AviSynth 和视频处理软件中没有采用这种方案的原因。
从理论上讲,可以制作一个不需要索引的混合插件,并为简单的用例提供相同的准确性和大致相同的速度,但它需要为 FFMPEG 中的每种格式重写所有文件源过滤器,所以自然没有人试过了。
目前基于 Avisynth 的解决方案有:
FFMS2
它首先索引整个文件并构建一个带有指向每个帧的指针的特殊缓存文件,从而可以在之后使用随机/任意帧访问。
索引包括解码视频数据(以及可选的音频),以便从磁盘读取整个文件。这就是为什么处理大文件的过程很慢的原因。
AviSource/LSMASHVideoSource
一些视频格式支持精确的帧访问,并且不需要在 AviSynth 中建立索引:
AviSource()
过滤器打开时LSMASHVideoSource()
过滤器打开时的 .MP4 和 .MOVDirectShowSource/dss2
使用内置DirectShowSource()或dss2()
来自DSS2mod的过滤器(最初是Haali 媒体拆分器的一部分,您可以将其 avss.dll 作为 AviSynth 插件加载)可以即时打开具有大部分精确寻帧(但不能保证)的文件。有很多限制。