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();
//...
发布评论