3 利用DirectShow开发简单媒体播放器
本节介绍基于DirectShow开发简单媒体播放器的关键步骤。
3.1 初始化DirectShow
由于DirectShow的组件都是以COM形式存在的,因此首先要调用CoInitializeEx函数来初始化COM库,嵌入所有的动态链接库和资源。否则,所有对QueryInterface的调用都会失败。
3.2 创建过滤器图表管理器接口
首先申明并初始化所需的接口:
// DirectShow interfaces IGraphBuilder *pGB = NULL; IMediaControl *pMC = NULL; IMediaEventEx *pME = NULL; IVideoWindow *pVW = NULL; IBasicAudio *pBA = NULL; IBasicVideo *pBV = NULL; IMediaSeeking *pMS = NULL; IMediaPosition *pMP = NULL; IVideoFrameStep *pFS = NULL; |
然后实例化一个过滤器图表管理器,并查询各接口:
// Get the interface for DirectShow's GraphBuilder CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGB); // QueryInterface for DirectShow interfaces pGB->QueryInterface(IID_IMediaControl, (void **)&pMC); pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME); pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS); pGB->QueryInterface(IID_IMediaPosition, (void **)&pMP); // Query for video interfaces, which may not be relevant for audio files pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW); pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV); // Query for audio interfaces, which may not be relevant for video-only files pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA); |
3.3 创建过滤器图表
应用DirectShow创建过滤器图表时,用户完全不需要操心系统使用了哪一类过滤器以及过滤器是怎样连接的。只要调用IGraphBuilder::RenderFile函数,就可以建成一个完整的过滤器图表。
// Have the graph builder construct its the appropriate graph automatically pGB->RenderFile(wFile, NULL); |
创建成功后,过滤器图表就可以用来播放多媒体文件了。DirectShow调用IMediaControl::Run函数来播放媒体文件。
// Run the graph to play the media file pMC->Run(); |
3.4 使用DirectShow的事件响应机制
DirectShow的事件响应机制是过滤器图表管理器与用户进行交互的接口,DirectShow处理的可以是一些事先可以预期的事件,比如数据流的结束;也可以是一些无法预期的错误。有的事件可以由过滤器图表管理器自己处理,但如果过滤器图表管理器自己无法处理这些事件,它就把事件的通知放在事件队列里。用户程序就可以通过IMediaEventEx接口得到事件,并对它做出相应的处理。
3.5 清除DirectShow
在程序结束时必须调用Release函数释放DirectShow的接口指针,并调用CoUninitialize函数来卸载COM库,释放所有的动态链接库和资源。
4 结束语
应用DirectX的组件DirectShow进行多媒体应用程序的开发需了解多方面的知识,但在很多应用中利用DirectShow的特性可以减少工作量并能获得非常高的运行效率。在Visual C++(www.cppentry.com) 6.0的开发环境中利用DirectShow开发的简单媒体播放器,具有随机播放、暂停和调整播放速率等功能,且可以播放多种媒体文件,播放效果非常流畅。因此,基于DirectShow开发多媒体应用程序的方法简单高效,是一种值得推荐的方法。
|