直接显示图 - 如何获得当前的fps?

时间:2010-09-15 15:13:03

标签: c++ winapi com filter directshow

我有一个IFilterGraph的实例 - 我自己的带有视频过滤器的图形(source,transofrm和renderer)。如何获取运行图的当前fps(视频帧速率)?

此致 多米尼克

3 个答案:

答案 0 :(得分:2)

可能最简单的方法是使用自定义回调创建SampleGrabber过滤器,并自行计算。

请参阅:

ISampleGrabber

ISampleGrabber::SetCallback

ISampleGrabberCB

每次调用回调函数时,都会收到一个新帧。您可能应该在渲染器之前放置它。

此外,根据您的图表,某些过滤器可能包含有关帧速率的信息,但SampleGrabber方法可用于任何图形。

答案 1 :(得分:2)

我希望这会有所帮助。这是我多月前写的一个例程,用于获取我正在播放的视频的FPS。适用于各种媒体类型,但如果需要,您应该能够弄清楚如何使用此类媒体类型。有关详细信息,请参阅AM_MEDIA_TYPE上的MSDN页面。

inline static void GetVideoFramesPerSecond( const AM_MEDIA_TYPE * pVT, long *plFramesPerSecond )
{
long nTenMillion    = 10000000;
long lAvgFrameDuration  = 0;

if( pVT->formattype == FORMAT_VideoInfo || pVT->formattype == FORMAT_MPEGVideo )    
    lAvgFrameDuration = (LONG) ((VIDEOINFOHEADER *)(pVT->pbFormat))->AvgTimePerFrame;

else if( pVT->formattype == FORMAT_VideoInfo2 || pVT->formattype == FORMAT_MPEG2_VIDEO )    
    lAvgFrameDuration = (LONG) ((VIDEOINFOHEADER2 *)(pVT->pbFormat))->AvgTimePerFrame;

*plFramesPerSecond = ( lAvgFrameDuration != 0 ) ? ((long)( nTenMillion / lAvgFrameDuration )) : 0;
}

答案 2 :(得分:1)

并非每个视频都有恒定的FPS,因此使用样本采集器是最准确的方法,尽管不是最简单的方法。 如果您知道视频的格式,并且您确定它是具有恒定FPS的格式,您可以获得转换或渲染器过滤器,获取其中一个引脚,调用IPin :: ConnectionMediaType,查看媒体类型的格式类型,无论是FORMAT_VideoInfo还是FORMAT_VideoInfo2,相应地转换格式指针指向VIDEOINFOHEADER或VIDEOINFOHEADER2并查看AvgTimePerFrame字段。