我想使用 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/