我正在使用由VMR9实例组成的FilterGraph呈现视频文件。 FilterGraph是使用GraphBuilder-> RenderFile()自动创建的。基本上我的设置在这里描述:http://www.codeproject.com/Articles/9206/Using-the-DirectShow-Video-Mixing-Renderer-filte
事情是:我想检测一些视频内部结构,如FPS,持续时间等。调用RenderFile()后,视频会正确显示MediaControl-> StopWhenReady()并播放Run()和Pause( )。 为了检测帧速率,我尝试从VMR9的输入引脚获取AM_MEDIA_TYPE结构:
VRM->FindPin("VMR Input0", pin); // S_OK
pin->ConnectionMediaType(&mt); // VFW_E_NOT_CONNECTED
在我看来,应该通过调用RenderFile()正确创建过滤器图,因此该引脚应该连接到我的输入流。为什么不是这种情况,在这件事上有什么办法?
Microsoft提供了一些函数(http://msdn.microsoft.com/en-us/library/windows/desktop/dd375791%28v=vs.85%29.aspx)来遍历图形并查找允许访问AM_MEDIA_TYPE的特定接口,如IID_IAMStreamConfig。但是这些选项在我的实现中失败了。我可以访问的唯一引脚是上面提到的。
提前致谢!
答案 0 :(得分:1)
你假设过滤器和引脚,你所持有的接口是连接的,它们正是你感兴趣的对象。这不一定是真的,过去的一些问题表明人们错误地理解了他们创建的拓扑。您需要查看过滤器图表,确保您拥有预期的结果。请参阅:How can I reverse engineer a DirectShow graph?
你有一个正确的引脚连接,确实你需要使用ConnectionMediaType
,然后通过AM_MEDIA_TYPE
到VIDEOINFOHEADER
或VIDEOINFOHEADER2
再到AvgTimePerFrame
成员。