FFMS2中的快速视频帧跳转访问

时间:2016-02-14 08:30:19

标签: video ffmpeg libvlc avisynth

FFMS2提供多个视频编解码器的帧精确访问。 但是当我们进行长距离跳帧时它很慢。

什么能够实现快速帧跳转访问,或像VLC这样的现有视频播放器如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

视频播放器使用合并到视频文件中的时间到文件位置索引。当您导航到某个时间码时,播放器会读取该索引,找到先前的关键帧,解码找到的关键帧与对应于所请求的时间码的帧之间的所有帧,然后显示它。在大多数情况下,为了获得该帧,需要做很多额外的工作,这就是AviSynth和视频处理软件中没有采用这种方案的原因。

从理论上讲,可以制作一个不需要索引的混合插件,并且可以为简单的用例提供相同的精度和大致相同的速度,但是它需要为FFMPEG中的每种格式重写所有文件源过滤器,所以,当然,没人试过。

目前基于Avisynth的解决方案是:

  1. <强> FFMS2

    它首先索引整个文件并构建一个特殊的缓存文件,其中包含指向每个帧的指针,从而可以在之后使用随机/任意帧访问。

    索引包括解码视频数据(以及可选的音频),以便从磁盘读取整个文件。这就是大文件进程缓慢的原因。

  2. <强> AviSource / LSMASHVideoSource

    一些视频格式支持精确的帧访问,不需要在AviSynth中进行索引:

      通过内置AviSource()过滤器打开时,
    • .AVI 从L-SMASH-Works
    • 通过LSMASHVideoSource()过滤器打开时,
    • .MP4和.MOV
  3. <强> DirectShowSource / DSS2

    使用来自DirectShowSource()的内置DSS2moddss2()过滤器(最初属于{{}的一部分,可以即时打开大多数精确寻帧(但无法保证)的文件3}},您可以将其avss.dll加载为AviSynth插件)。有很多限制。