Directshow returns 帧率 FPS 错误
Directshow returns wrong Frame rate FPS
我想使用 DirectShow 获得媒体文件的帧速率。
目前,我使用以下方法,但在某些情况下似乎不准确:
我将 SourceFilter
添加到我的图表中,枚举其引脚,然后调用 pPin->ConnectionMediaType(&compressedMediaFormat)
并从中提取 AvgTimePerFrame
。据我了解,它是以 100 纳秒表示的每帧平均时间。所以,我只是除以 10,000,000 / AvgTimePerFrame 以获得文件的平均 FPS。
对于那些所有帧的帧时间几乎相同的媒体文件,我得到了正确的 FPS。但是对于那些对于不同的帧有不同的帧时间的人来说,这种方法 returns 非常不准确的结果。
获得该文件的正确方法是获取文件的持续时间和帧数,并从中计算平均 FPS(帧数/持续时间)。这是一项代价高昂的操作,但据我所知,因为计算确切的帧数需要遍历整个文件。
我想知道是否有办法更准确地获取帧率信息?
媒体文件不必具有固定帧率,一般来说 - 可能有可变帧率。文件的元数据仍然有一些帧速率相关信息,在这种情况下,这些信息可能不准确。当您开始访问该文件时,您可以快速获得有关帧速率的元数据信息。实际上,要获得全貌,您应该读取所有帧并处理它们的时间戳。
尽管在许多技术上可以快速读取帧的时间戳而不读取实际数据,但 DirectShow demultiplexers/parsers 没有定义获取信息的方法,因此您必须读取和计数获取准确信息的框架。
虽然你不需要为此解压缩视频,你也可以在执行此操作时从过滤器图表中删除时钟,这样计算帧就不需要实时流式传输数据(帧将以最大流式传输在这种情况下的比率)。
我想使用 DirectShow 获得媒体文件的帧速率。
目前,我使用以下方法,但在某些情况下似乎不准确:
我将 SourceFilter
添加到我的图表中,枚举其引脚,然后调用 pPin->ConnectionMediaType(&compressedMediaFormat)
并从中提取 AvgTimePerFrame
。据我了解,它是以 100 纳秒表示的每帧平均时间。所以,我只是除以 10,000,000 / AvgTimePerFrame 以获得文件的平均 FPS。
对于那些所有帧的帧时间几乎相同的媒体文件,我得到了正确的 FPS。但是对于那些对于不同的帧有不同的帧时间的人来说,这种方法 returns 非常不准确的结果。
获得该文件的正确方法是获取文件的持续时间和帧数,并从中计算平均 FPS(帧数/持续时间)。这是一项代价高昂的操作,但据我所知,因为计算确切的帧数需要遍历整个文件。
我想知道是否有办法更准确地获取帧率信息?
媒体文件不必具有固定帧率,一般来说 - 可能有可变帧率。文件的元数据仍然有一些帧速率相关信息,在这种情况下,这些信息可能不准确。当您开始访问该文件时,您可以快速获得有关帧速率的元数据信息。实际上,要获得全貌,您应该读取所有帧并处理它们的时间戳。
尽管在许多技术上可以快速读取帧的时间戳而不读取实际数据,但 DirectShow demultiplexers/parsers 没有定义获取信息的方法,因此您必须读取和计数获取准确信息的框架。
虽然你不需要为此解压缩视频,你也可以在执行此操作时从过滤器图表中删除时钟,这样计算帧就不需要实时流式传输数据(帧将以最大流式传输在这种情况下的比率)。