通过 IWMPGraphCreation 接口来定制 WMP 的 Filter Graph

  Windows Media Player 内部也是利用 DirectShow 来播放音视频内容的,这一点可以通过注册了 DirectShow Filter Graph SpyGraphEdit 来证实。那么有没有可能把 WMP 控件内嵌到我们自己的程序里,然后控制它的 Filter Graph 生成过程呢?答案就是 IWMPGraphCreation 接口。去年(其实是上个月;))研究了一下这个接口,最后终因版本要求过高,不适合用在我们的项目里而放弃使用,这里简单的做点笔记。

  根据 MSDN,这个接口只有在 WMP 10 及以上版本才支持。实现这个接口,跟 WMP 交互然后达到控制 WMP 的 Filter Graph 生成的步骤如下:

1) 首先要实现一个从 IOleClientSite, IWMPGraphCreation 和 IServiceProvider 这 3 个接口派生的类
2) 从 WMP 控件实例中取得 IOleObject 接口指针,然后调用 IOleObject::SetClientSite() 把我们新实现的类作为 WMP 的 site
3) WMP 会从它的 site 那里通过 QueryInterface() 得到 IServiceProvider 接口指针
4) 得到 IServiceProvider 接口以后 WMP 会调用 IServiceProvider::QueryService() 来尝试得到 IWMPGraphCreation 的接口指针
5) 在从我们这里得到 IWMPGraphCreation 接口指针以后,WMP 会调用我们的 IWMPGraphCreation::GetGraphCreationFlags(),这时我们需要给 flag 设置一个 WMPGC_FLAGS_USE_CUSTOM_GRAPH,表示我们想要定制 WMP 的 Filter Graph
6) WMP 控件在播放音视频文件之前会调用我们的 IWMPGraphCreation::GraphCreationPreRender() 实现,同时把它内部的 Filter Graph 接口指针传给我们,拿到 Filter Graph 指针以后我们就可以做我们想做的事情了

  最大的问题出在 step 5,WMPGC_FLAGS_USE_CUSTOM_GRAPH 这个 flag 在 WMP 12 及以上版本才支持,所以这个版本需求实在是有点太高了!另外一个意外是我的实测观察到,在 WMP 12 上面,step 5 及其后的动作,WMP 会做两遍,而不是我们直觉中的一遍,原因不明(Google 到一些资料,也有人遇到了这样的问题)。

2 Responses to “通过 IWMPGraphCreation 接口来定制 WMP 的 Filter Graph”

  1. hh Says:

    如何从 WMP 控件实例中取得 IOleObject 接口指针?
    直接留言给我吧?我现在没法上邮箱

  2. hh Says:

    我现在要从IServiceProvider接口得到一个 IWMPRemoteMediaServices,不知道怎么实现,讨教了!

Leave a Reply