Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Directshow返回错误的帧速率FPS_C++_Winapi_Directshow_Frame Rate - Fatal编程技术网

C++ Directshow返回错误的帧速率FPS

C++ Directshow返回错误的帧速率FPS,c++,winapi,directshow,frame-rate,C++,Winapi,Directshow,Frame Rate,我想使用DirectShow获得媒体文件的帧速率 目前,我使用的方法在某些情况下似乎不准确: 我将一个SourceFilter添加到我的图形中,枚举它的管脚,然后调用一个pPin->ConnectionMediaType(&compressedMediaFormat)并从中提取AvgTimePerFrame。据我所知,它是以100纳秒表示的每帧平均时间。所以,我只需除以10000000/AvgTimePerFrame就可以得到文件的平均FPS 对于所有帧的帧时间几乎相同的媒体文件,我得到了正确的

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

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

我将一个
SourceFilter
添加到我的图形中,枚举它的管脚,然后调用一个
pPin->ConnectionMediaType(&compressedMediaFormat)
并从中提取
AvgTimePerFrame
。据我所知,它是以100纳秒表示的每帧平均时间。所以,我只需除以10000000/AvgTimePerFrame就可以得到文件的平均FPS

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

正确的方法是获取文件的持续时间和帧数,并计算出其中的平均FPS(帧数/持续时间)。然而,据我所知,这是一个代价高昂的操作,因为计算准确的帧数需要遍历整个文件


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

通常,媒体文件不必具有固定的帧速率-可能存在可变的帧速率。文件的元数据仍然包含一些与帧速率相关的信息,在本例中,这些信息可能不准确。当您开始访问该文件时,您可以快速获得有关帧速率的元数据信息。事实上,为了获得完整的图片,你应该阅读所有帧并处理它们的时间戳

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


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

我完全同意此解决方案,但我想知道是否有一种方法可以提取快速可用的元信息。例如,当您右键单击文件并选择“属性”,然后选择“详细信息”时,它会告诉您帧速率。我怀疑它是否使用这种查找技术,因为即使打开一个大小为几GB的文件也不需要时间。我希望在细节部分显示该值,即使它有点不准确。所以,我正在寻找一个替代媒体基础<代码> imfediaType > > GuuTuN32(MfAtMavaVGGBITRATE)在DirectShowAlternative,这是<代码> avgTimePrime> <代码>值,您在该问题中提到的Media Type。这是一个直接的等价物。但是,DirectShow和Media Foundation解析器可以不同地提取元数据,并且在某些情况下,提取的值可能会有所不同。对于一些媒体文件媒体基础和右击属性->细节显示8个fps,同时用<代码> > avgTimePrFrase以24个FPS结束。因为它与解析器实现相关,所以这里没有很多选项。您请求了一个值,您应该信任它。由于帧速率可能是可变的,因此该值更多地是信息性的,您可能会被错误地告知,而提要的其余部分可以很好地播放。同样,在一般情况下,只有通过流式传输文件才能获得准确的帧时间。