FFMS2中的快速视频跳帧访问
The fast video frame jump access in FFMS2
FFMS2 提供对多个视频编解码器的帧精确访问。
但是当我们做远距离跳帧访问的时候就慢了。
是什么实现了快速跳帧访问,或者像 VLC 这样的现有视频播放器是如何实现的?
视频播放器使用合并到视频文件中的时间到文件位置索引。当您导航到某个时间码时,播放器会读取该索引,找到之前的关键帧,解码找到的关键帧和对应于所请求时间码的帧之间的所有帧,然后显示它。在大多数情况下,需要做很多额外的工作才能获得该帧,这就是为什么 AviSynth 和视频处理软件通常不采用这种方案的原因。
从理论上讲,可以制作一个不需要索引的混合插件,并且可以为简单用例提供相同的准确性和大致相同的速度,但它需要为 FFMPEG 中的每种格式重写所有文件源过滤器,因此,当然,没有人尝试过。
目前基于 Avisynth 的解决方案是:
FFMS2
它首先索引整个文件并构建一个特殊的缓存文件,其中包含指向每个帧的指针,因此可以在之后使用 random/arbitrary 帧访问。
索引包括视频数据(以及可选的音频)的解码,因此整个文件都是从磁盘读取的。这就是大文件处理速度缓慢的原因。
AviSource/LSMASHVideoSource
一些视频格式支持精确的帧访问并且不需要在 AviSynth 中建立索引:
- .AVI 通过内置
AviSource()
过滤器打开时
- .MP4 和 .MOV 当通过
LSMASHVideoSource()
过滤器从 L-SMASH-Works 打开时
DirectShowSource/dss2
使用内置的 DirectShowSource() or dss2()
filter from DSS2mod (originally a part of Haali media splitter 可以即时打开具有大部分精确帧搜索(但不保证)的文件,您可以将其 avss.dll 作为 AviSynth 插件加载)。有很多限制。
FFMS2 提供对多个视频编解码器的帧精确访问。 但是当我们做远距离跳帧访问的时候就慢了。
是什么实现了快速跳帧访问,或者像 VLC 这样的现有视频播放器是如何实现的?
视频播放器使用合并到视频文件中的时间到文件位置索引。当您导航到某个时间码时,播放器会读取该索引,找到之前的关键帧,解码找到的关键帧和对应于所请求时间码的帧之间的所有帧,然后显示它。在大多数情况下,需要做很多额外的工作才能获得该帧,这就是为什么 AviSynth 和视频处理软件通常不采用这种方案的原因。
从理论上讲,可以制作一个不需要索引的混合插件,并且可以为简单用例提供相同的准确性和大致相同的速度,但它需要为 FFMPEG 中的每种格式重写所有文件源过滤器,因此,当然,没有人尝试过。
目前基于 Avisynth 的解决方案是:
FFMS2
它首先索引整个文件并构建一个特殊的缓存文件,其中包含指向每个帧的指针,因此可以在之后使用 random/arbitrary 帧访问。
索引包括视频数据(以及可选的音频)的解码,因此整个文件都是从磁盘读取的。这就是大文件处理速度缓慢的原因。
AviSource/LSMASHVideoSource
一些视频格式支持精确的帧访问并且不需要在 AviSynth 中建立索引:
- .AVI 通过内置
AviSource()
过滤器打开时 - .MP4 和 .MOV 当通过
LSMASHVideoSource()
过滤器从 L-SMASH-Works 打开时
- .AVI 通过内置
DirectShowSource/dss2
使用内置的 DirectShowSource() or
dss2()
filter from DSS2mod (originally a part of Haali media splitter 可以即时打开具有大部分精确帧搜索(但不保证)的文件,您可以将其 avss.dll 作为 AviSynth 插件加载)。有很多限制。