需要知道DirectShow是DirectX中的一部分。DirectX是Microsoft公司推出的一套底层应用程序编程接口,主要用于游戏和其它高性能多媒体应用。这些接口包含对二维图形、三维图形、声效和音乐、输入设备及多玩家网络游戏等的支持。这里重点讲用DirectShow设计视频播放器。关于DirectShow安装流程见网上的教程。
下面介绍DirectShow系统组成,如下图(摘自网上):
其中过滤器流水线是由一系列各种功能的过滤器,其实DirectShow对数据流是分成几个独立的过程进行处理的,每个过程完成不同的工作。
IGraphBuilder:为应用程序提供创建过滤器图表的方法;
IMediaControl:提供控制过滤器图表中多媒体数据流的方法,包括运行、暂停和停止;
IMediaEventEx:继承自IMediaEvent接口,处理过滤器图表的事件;
IVideoWindow:用于设置多媒体播放器窗口的属性,应用程序可以用它来设置窗口的所有者、位置和尺寸等属性;
IBasicAudio:用于控制音频流的音量和平衡;
IBasicVideo:用于设置视频特性,例如显示的目的区域和源区域;
IMediaSeeking:提供搜索数据流位置和设置播放速率的方法;
IMediaPosition:用于寻找数据流的位置;
IVideoFrameStep:用于逐帧播放视频流,可使DVD播放器一次只播放一帧视频。
基本开发流程:
1、调用CoInitializeEx()函数初始化COM库,嵌入所有动态链接库和资源;
2、创建过滤器图表管理接口:
IGraphBuilder *pGB = NULL;
IMediaControl *pMC = NULL;
等等;
3、实例化一个过滤器图表管理器:
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGB); //获取过滤器图表管理器创建者指针;
//查询过滤器接口
pGB -> QueryInterface(IID_IMediaControl,(void **)&pMC);
等等;
4、创建过滤器图表:
pGB -> RenderFile(wFile,NULL);
5、调用函数播放媒体文件:pMC -> Run();
6、使用事件响应机制。通过IMediaEventEx接口得到事件,并对它作出相应处理;
7、清除DirectShow,调用Release()函数释放DirectShow,再调用CoUninitialize()卸载COM库。
实际使用时,通常把DirectShow封装成类来使用。
常用的方法:
CoCreateInstance(...); //实例化一个过滤器图表管理器
pGB -> QueryInterfaces(...); //查询各过滤器接口
pGB -> RenderFile(...); //创建过滤器图表
pMC -> Run(); //播放
pMC -> Pause();
pMC -> Stop();
pMC -> GetState(..); //获取播放状态
pME -> SetNotifyWindow(...); //指派窗口作为消息接受者
pBV -> get_SourceWidth(..); //检测视频窗口宽度
pBV -> get_SourceHeight(..);
pBV -> GetCurrentImage(..); //获取图像
pBA -> put_Volume(...); //设置音量
pBA -> get_Volume(...); //获取音量
pBA -> put_Balance(...); //设置声音平衡
pBA -> get_Balance(...); //获取声音平衡
pVW -> put_Visible(...); //可访问属性
pVW -> put_Owner(...); //父窗体
pVW -> put_Left(...);
pVW -> put_Top(...);
pVW -> put_Width(...);
pVW -> put_Height(...);
pVW -> put_WindowStyle(...); //播放窗口属性
pVW -> put_MessageDrain(...); //消息发送到父窗体
pVW -> SetWindowPosition(...); //设置窗口位置
pVW -> put_FullScreenMode(...); //全屏播放模式
PVW -> HideCursor(...); //隐藏系统光标
pMS -> GetDuration(...); //获取数据流长度
pMS -> GetCurrentPosition(...); //获取播放进度
pMS -> SetPosition(...); //设置播放进度
最后是各个接口都有的->Release(),释放接口指针