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