比ffmpeg更快的帧提取

时间:2013-01-21 17:53:17

标签: c# .net video ffmpeg directshow

我有一个视频分析程序,可以处理来自视频的各种帧。 (好几个小时) 视频很可能是MP4,但也可能是其他格式。

目前,我有一个围绕ffmpeg调用的C#包装器,用于在请求的时间提取单个帧。 (我正在使用ffmpeg.exe二进制文件。不是直接的库) 目前,这一切都有效。但它很慢。很慢。

我已经找到了通过将提取的帧存储在ramdisk中来提高速度的方法。更改存储的图像格式等...

我只是想检查是否有人能想出任何方法来拉出单个帧。以瞬间准确度。 我知道这可能与DShow等有关......我直接使用FFMPEG,因为我之前使用过它。但如果DShow可能会更快,我很乐意改变!

2 个答案:

答案 0 :(得分:1)

在Windows中,您可以使用本机API来处理媒体文件,特别是读取媒体文件:

  • DirectShow的
  • 媒体基金会

两者都支持MP4(H.264视频),DirectShow作为由第三方MP4解复用器扩展的框架和H.264解码器(需要,Windows 7提供构建它)和Media Foundation - 本地或扩展第三方扩展取决于操作系统版本。

两者都可以分别通过开源包装器DirectShow.NET和Media Foundation .NET与.NET连接。这比单个帧的FFmpeg CLI更快方式。另请注意,您可以逐步获取帧,而无需查找特定时间并执行过多的重复工作,甚至不提及进程启动/初始化开销。或者,您可以通过包装器将FFmpeg / Libav二进制文件用于C#并获得类似的性能。

答案 1 :(得分:0)

您可以更改偏移参数的位置。如果视频包含您可以更快地通过视频搜索的有效元数据,则该顺序对速度很重要。

如果在输入文件之前放置偏移量,则将使用比特率计算偏移量,而不是每次都精确计算(在可变比特率的情况下),但速度要快得多。正确的方法是遍历视频(偏移参数在输入文件之后),但这需要时间。