直接显示返回错误的帧速率 FPS

Directshow returns wrong Frame rate FPS

本文关键字:帧速率 FPS 错误 返回 显示      更新时间:2023-10-16

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

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

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

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

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

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

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

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

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