【问题标题】:Direct Show graph - how to get the current fps?直接显示图表 - 如何获取当前 fps?
【发布时间】:2011-04-12 18:05:02
【问题描述】:

我有一个 IFilterGraph 实例 - 我自己的带有视频过滤器(源、transofrm 和渲染器)的图表。如何获取当前运行图的fps(视频帧率)?

问候 多米尼克

【问题讨论】:

    标签: c++ winapi com filter directshow


    【解决方案1】:

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

    见:

    ISampleGrabber

    ISampleGrabber::SetCallback

    ISampleGrabberCB

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我希望这会有所帮助。这是我很多个月前编写的一个例程,用于获取我正在流式传输的视频的 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多