VC++ DirectShow的使用

需要知道DirectShow是DirectX中的一部分。DirectX是Microsoft公司推出的一套底层应用程序编程接口,主要用于游戏和其它高性能多媒体应用。这些接口包含对二维图形、三维图形、声效和音乐、输入设备及多玩家网络游戏等的支持。这里重点讲用DirectShow设计视频播放器。关于DirectShow安装流程见网上的教程。


下面介绍DirectShow系统组成,如下图(摘自网上):

VC++ DirectShow的使用_第1张图片


其中过滤器流水线是由一系列各种功能的过滤器,其实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(),释放接口指针

你可能感兴趣的:(VC++)