c++ - Directshow 返回错误的帧速率 FPS

标签 c++ winapi directshow frame-rate

我想使用 DirectShow 获取媒体文件的帧速率。

目前,我使用以下方法,在某些情况下似乎不准确:

我将 SourceFilter 添加到图表中,枚举其引脚,然后调用 pPin->ConnectionMediaType(&compressedMediaFormat) 并提取 AvgTimePerFrame从中。据我了解,它是每帧的平均时间,以 100 纳秒表示。因此,我只需除以 10,000,000/AvgTimePerFrame 即可得到文件的平均 FPS。

对于那些所有帧的帧时间几乎相同的媒体文件,我得到了正确的 FPS。但对于那些不同帧具有不同帧时间的情况,此方法返回的结果非常不准确。

正确的方法是获取文件的持续时间和帧数,并计算出平均 FPS(帧数/持续时间)。然而,据我了解,这是一项成本高昂的操作,因为计算确切的帧数需要遍历整个文件。

我想知道是否有办法更准确地获取帧速率信息?

最佳答案

一般来说,媒体文件不必具有固定的帧速率 - 可能有可变的帧速率。文件的元数据仍然具有一些与帧速率相关的信息,在这种情况下,这些信息可能不准确。当您开始访问文件时,您可以快速获得有关帧速率的元数据信息。事实上,为了获得完整的图片,您应该读取所​​有帧并处理它们的时间戳。

尽管在许多技术上可以快速读取帧的时间戳而不读取实际数据,但 DirectShow 解复用器/解析器没有定义获取信息的方法,因此您必须读取并计算帧才能获得准确的信息。

不过,您不需要为此解压缩视频,并且您还可以在执行此操作时从过滤器图中删除时钟,以便计算帧不需要实时流式传输数据(帧将以最大速率流式传输)这种情况)。

关于c++ - Directshow 返回错误的帧速率 FPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45737920/

相关文章:

c++ - F.54 : If you capture this, 显式捕获所有变量(没有默认捕获)

c++ - 在矩阵中寻找最长的递增路径

c++ - map operator[] 的返回值(和 "at"方法)

c++代码重构使用函数对象

c++ - 枚举 HWND 属性 C++

c++ - 我怎样才能找到 DirectShow 过滤器的 clsid?

directshow - 如何检测网络摄像头插入/拔出?

visual-c++ - 如何将 H264 DS Filter 与 Directshow GraphEdit 结合使用

c++ - 封装WndProc问题

c++ - WinApi 相当于 .NET KeyPreview