Directshow返回错误的帧速率FPS

时间:2017-08-17 14:30:11

标签: c++ winapi directshow frame-rate

我希望使用DirectShow获得媒体文件的帧速率。

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

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

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

获得该文件的正确方法是获取文件的持续时间和帧数,并计算其中的平均FPS(frameCount / duration)。这是一项代价高昂的操作,但据我所知,因为计算确切的帧数需要通过整个文件。

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

1 个答案:

答案 0 :(得分:2)

通常,媒体文件不必具有固定的帧速率 - 可能存在可变的帧速率。文件的元数据仍然具有一些帧速率相关信息,在这种情况下,这些信息可能是不准确的。当您开始访问该文件时,您可以获得有关帧速率的快速可用元数据信息。实际上,为了获得全貌,您应该阅读所有帧并处理其时间戳。

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

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