我使用IQualProp :: get_AvgFrameRate方法从EVR渲染器获取平均帧速率。它运行良好,但是在DirectShow图中调用“暂停/运行”后,我得到了错误的帧频值。这是我的一些解决方案:
标准解决方案:
bool Pause(){IMediaControl * pMediaControl;pMediaControl-> Pause();}
bool Run(){IMediaControl * pMediaControl;pMediaControl-> Run();}
在pMediaControl-> Run()之后,渲染器向我显示了帧速率值,比所需的小两倍。但是在10到15秒内,这些值将恢复。
通过Stop()方法:
bool Pause(){IMediaControl * pMediaControl; pMediaControl-> Stop();pMediaControl-> Pause();}
bool Run(){IMediaControl * pMediaControl;pMediaControl-> Run();}
进入Pause(),我添加了pMediaControl-> Stop()。在Run()之后,我获得了正确的帧速率,但是渲染器冻结了10-15秒。
使用IMediaFilter :: Run()
bool Pause(){IMediaControl * pMediaControl; pMediaControl-> Stop();pMediaControl-> Pause();}
bool Run(){IMediaFilter * pMediaFilter;pMediaFilter-> Run(1000000); //延迟10ms}
这里,我得到了不错的结果,没有冻结和错误的值。但是,CPU利用率是Pause()之前的两倍。
想法?
当我通过计算帧获得平均帧速率时,我可以返回到我的旧模式,但是我想使用IQualProp :: get_AvgFrameRate方法。
我回到了旧的模式。重写获得平均FPS的代码比重做三个源过滤器要好]