【发布时间】:2011-04-12 18:05:02
【问题描述】:
我有一个 IFilterGraph 实例 - 我自己的带有视频过滤器(源、transofrm 和渲染器)的图表。如何获取当前运行图的fps(视频帧率)?
问候 多米尼克
【问题讨论】:
标签: c++ winapi com filter directshow
我有一个 IFilterGraph 实例 - 我自己的带有视频过滤器(源、transofrm 和渲染器)的图表。如何获取当前运行图的fps(视频帧率)?
问候 多米尼克
【问题讨论】:
标签: c++ winapi com filter directshow
可能最简单的方法是使用自定义回调创建 SampleGrabber 过滤器,然后自己计算。
见:
每次调用您的回调函数时,您都会收到一个新帧。你可能应该把它放在渲染器之前。
此外,根据您的图表,某些过滤器可能包含有关帧速率的信息,但 SampleGrabber 方法适用于任何图表。
【讨论】:
并非每个视频都具有恒定的 FPS,因此使用采样采集器是最准确的方法,尽管不是最简单的方法。 如果您知道视频的格式并且确定它具有恒定的 FPS,则可以获取转换或渲染器过滤器,获取其引脚之一,调用 IPin::ConnectionMediaType,查看媒体类型的格式类型是 FORMAT_VideoInfo 还是 FORMAT_VideoInfo2,相应地将格式指针转换为 VIDEOINFOHEADER 或 VIDEOINFOHEADER2 并查看 AvgTimePerFrame 字段。
【讨论】:
我希望这会有所帮助。这是我很多个月前编写的一个例程,用于获取我正在流式传输的视频的 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;
}
【讨论】: