2024年5月1日发(作者:)

第一部分 DirectShow基础知识

第1章 系统概述

1.1 DirectX 大家族

1. DirectX软件开发包是微软公司提供的一套在Wdinows操作平台上开发高性

能图形、声音、输入、输出和网络游戏的编程接口。

2. DirectShow是DirectX中的一位集大成者。

1.2 DirectShow简介

一、DirectShow系统

1. 图中最大的一块是DriectShow系统,虚线以下是Ring0特权级别的

硬件设备,虚线以上是Ring3特权级别的应用层。DirectShow位于

应用层中。

它使用一种叫作Filter Graph的模型来管理整个数据流的处理过程;

参与数据处理的各个功能模块叫作Filter;各个Filter在Filter Graph

中按一定的顺序连接成一条流水线协同工作。

Filter大致分为3类:

(1) Source Filters 负责获取数据,文件源可以是文件等,然后将

数据往下传输。

(2) Transform Filters负责数据的格式转换,将数据继续往下传输。

(3) Rendering Filters负责数据的最终去向,将数据送给显卡、声

卡进行多媒体的演示,或者输出到文件进行存储。

二、播放第一个媒体文件

2.

3.

1.3 COM编程基础

CoInitialize(NULL); //COM库初始化

//

//...

IUnknown *pUnk = NULL;

IObject *pObject= NULL;

//创建组件对象

HRESULT hr = CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL,

IID_IUnknown, (void**)&pUnk);

if(SUCCEEDED(hr))

{

}

//查询得到组件对象上的接口

hr = pUnk->QueryInterface(IID_IObject, (void**)&pObject);

if(SUCCEEDED(hr))

{

}

pUnk->Release();

//调用接口方法

pObject->SomeMethod();

pObject->Release();

//释放COM库使用的资源

CoUninitialize();

1. Filter本身是一种COM组件,开发Filter牵涉到了COM组件的“实现”

问题。

2. COM本身是一种规范,而不是实现。当使用C++实现时,COM组件就是

一个C++类,而接口就是纯虚类。

3. COM规范规定,任何组件或接口都必须从IUnknown接口中继承而来。

IUnknown定义了3个重要函数:

(1) QueryInterface负责组件对象上的接口查询

(2) AddRef增加引用计数

(3) Release用于减少引用计数

4. COM组件实际上是一个C++类,对于组件的外部使用者来说,这个类名

一般不可知。COM规范规定,每个组件都必须实现一个与之相对应的类

工作Class Factory。类工厂也是一个COM组件,它实现了IClassFactory

接口。在IClassFactory接口函数CreateInstance中,才能使用new操作

生成一个COM组件实例。

5. COM组件有3种类型:进程内组件、本地线程组件和远程组件。Filter

一般是一种进程内组件,以DLL(动态链接库)的形式提供服务。

6. COM组件的实现

每一个COM组件都使用一个GUID来惟一标识。

1. 当创建一个COM组件时,总是先通过这个GUID调用

CoGetClassObject来获得创建这个组件对象的类工厂。

2. 然后调用类工厂的接口方法IClassFactory::CreateInstance,就能真正

创建CLSID_Object标识的组件对象了。

CoCreateInstance(...)

{

//Do something

//...

IClassFactory *pClassFactory = NULL;

CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, CoGetClassObject(CLSID_OBJECT,

(void**)&pClassFactory);

}

1. DllGetClassObject是在COM组件DLL中必须实现的一个导出函数,

它的作用是根据指定的组件GUID创建相应的类工厂对象,并返回这

个类工厂的IClassFactory接口;

2. CreateInstance是IClassFactory接口的一个接口方法,负责最终创建

组件对象实例;

3. CObject是我们的COM组件类,它实现了COM框架以外的真正的组

件功能。

pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);

pClassFactory->Release();

//...

CoGetClassObject(...)

{

//通过查询注册表CLSID_Ojbect 得知组件DLL文件路径

//装入DLL库(调用LoadLibrary)

//使用函数GetProcAddress(...)得到DLL中函数DllGetClassObject的函数指针

//调用DllGetClass得到类工厂对象指针

}

DllGetClassObject(...)

{

}

Cfactory::CreateInstance(...)

{

}

第2章 Filter原理

第3章 DirectX媒体对象(DMO)

//...

//创建CLSID_Ojbect对应的组件对象

CObject *pObject = new CObject;

pObject->QueryInterface(IID_IUnknown, (void**)&pUnk);

pObject->Release();

//...

//...

//创建类工厂对象

CFactory* pFactory = new CFactory;

//查询得到IClassFactory指针

pFactory->QueryInterface(IID_IClassFactory, (void**)&pClassFactory);

pFactory->Release();

//...