DMO其实就是一个COM组件,是一个加了微软一种媒体处理解决方案的特殊的COM。因此你可以使用Visual C++的ATL来实现,此次创建的工程是以Visual C++2003+WinxpSp2为开发平台。
下面说明如何使用ATL创建一个工程:
1)启动Visual C++2003
2)点击“文件”->“新建”->“工程”->“项目”
3)选择“Visual C++项目”->“ATL”->选择“ATL项目”->“名称”里输入工程名,如“TestDMO”
4)去掉“属性化”选项->点击“完成”
5)鼠标右键选中“TestDMO”工程名->“添加”->“添加类”,选择“ATL简单对象”->点击下面的“打开”->在“简称”里输入如“TestEncoder”->点击左边的“选项”->“线程模型”为“两者”->勾上右边的“自由线程封送拆收器”,其它选项默认。
6)去掉“CTestEncoder”继承模板“IDispatchImpl”及COM_INTERFACE_ENTRY(IDispatch)
7)如果你不需要外部输入参数至DMO,你可以将idl文件去掉,并且注释掉“rc资源文件”中的tlb信息
8)“CTestEncoder”继承于IMediaObjectImpl<CTestEncoder, 1, 2>模板类,其中1代表DMO有一个输入,2代表有两个输出
9)在BEGIN_COM_MAP下加接口映射:COM_INTERFACE_ENTRY(IMediaObject)
10)在“DLL注册”CPP文件最上面加入如下语句:#define FIX_LOCK_NAME #include <dmo.h> #include <dmoimpl.h> #include <initguid.h> #include <limits.h>
11)在“DllRegisterServer”中注册DMO,代码:DMORegister(L"TestEncoderDMO",CLSID_TestEncoder,DMOCATEGORY_VIDEO_ENCODER,0,0,NULL,0,NULL);
12)在“DllUnregisterServer”注销DMO,代码:DMOUnregister(CLSID_TestEncoder,DMOCATEGORY_VIDEO_ENCODER);
13)实现“IMediaObjectImpl模板类”的17个必须实现的方法。
IMediaObject *m_pDMO;
ITestEncoder *m_pEncoder;//如果自定义了接口,可以使用QueryInterface方法查询
HRESULT hr = CoCreateInstance(CLSID_TestEncoder, NULL, CLSCTX_INPROC, IID_IMediaObject, (void **)&m_pDMO);
if(FAILED(hr))
{
_tprintf(_T("/nERROR - Could not create the DMO./n"));
return E_INVALIDARG;
}
//如果没有自定义的接口,下面代码可以省略
hr = m_pDMO->QueryInterface(IID_ITestEncoder, (void**)&m_pEncoder);
if (FAILED(hr))
{
_tprintf(_T("/nERROR - Could not QueryInterface the TestFace./n"));
return E_INVALIDARG;
}
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void **>(&pFilter));
if(SUCCEEDED(hr))
{
IDMOWrapperFilter *pDmoWrapper;
hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, (void**)&pDmoWrapper);
if(SUCCEEDED(hr))
{
hr = pDMOWrapper->Init(CLSID_TestEncoder, DMOCATEGORY_VIDEO_ENCODER);
pDmoWrapper->Release();
if(SUCCEEDED(hr))
{
hr = pGraph->AddFilter(pFilter, L"TestEncoder");
}
}
pFilter->Release();
}
对于DMO处理数据之前,必须先设置输入与输出的媒体类型,可选流(Optional Stream)除外,使用DMO_MEDIA_TYPE结构设置媒体类型,使用DMO的SetInputType与SetOutputType设置输入输出媒体类型。
设置媒体类型的原则:
1)对于解码DMO,一般先设置输入流媒体类型,然后再设置输出流的媒体类型
2)对于编码DMO,一般先设置输出流媒体类型,然后再设置输入流的媒体类型
3)对于音效DMO,一般使用可选流(Optinal Stream),可以不设媒体类型
DMO一般有两种数据处理方式,普通方式和“Inplace”方式。每个对象都要实现IMediaObject接口(可以继承于IMediaObjectImpl类作简化操作),普通方式是通过这个接口的IMediaObject::ProcessInput处理输入流数据,IMediaObject::ProcessOutput处理输出流数据。“Inplace”方式处理数据,必须依赖于“IMediaObjectInPlace”这个接口,因此除了继承“IMediaObject”接口外还要继承“IMediaObjectInPlace”,通过调用IMediaObject::Process来处理数据。
对于编码DMO来说,就是将所要编码的数据使用ProcessInput方法给DMO编码,编码完成后使用ProcessOutput方法取出编码数据。解码DMO类似。
相关推荐
to a `DMO coverage' consistent with DMO stacking. A definition of constant-velocity DMO coverage will be proposed here. A subsurface reflector will be illuminated from a given source and receiver ...
DirectX Media Object例子
本文档主要介绍Hi3531 DMO单板基本功能特点和硬件特性、多功能硬件配置、软件调试操作使用方法。 本文档(本指南)主要适用以下工程师: · 技术支持工程师 · 单板硬件开发工程师
dmo报告输出设置.pdf
DirectShow 相关DMO的源代码
dmo demo 带进度条的备份.zip
dmo4j 解析XML文件,遍历节点,xstream 实现对象和XML之间的转换!
基于SQL Server-DMO的数据库备份与恢复
使用SQL-DMO对象让人且喜且忧。它提供了非常丰富的功能,以至于不知该如何使用。本文只讨论示例涉及的对象属性和方法。你可以在SQL Server在线教学上找到许多相关信息。 如果用VB或C++编程,可以用事件触发来校验...
AMR Decoder DMO(Filter)基于DShow的解码器 DEFINE_GUID(CLSID_AMRDecoder, 0xc77b4ccf, 0x6efb, 0x4503, 0x8c, 0x42, 0x15, 0x6a, 0x73, 0xed, 0xc2, 0x9e);
dom4j解析dom4j解析dom4j解析dom4j解析dom4j解析dom4j解析dom4j解析
基于DirectShow与DMO的视频采集与编码实现
ERP迁移至S4HANA 第五步: Technical conversion with SUM(DMO)
这是一个DMO组件,演示了Windows Media支持的水印叠加功能.开发平台,VC6.0
基于SQL-DMO的SQL Server远程管理.pdf
SQL-DMO 分发安装包 for SQL Server 2000(原创),由SQL SERVER 2000 整理得来,包括安装文件和卸载文件。
HI3531DMO原理图可以编辑资料,海思平台NVR大部分可以参考
关于DirectShow中的一些配套示例代码,对于初学DirectShow的朋友大有帮助
DMO_LQ084S3DG01 199x149原装彩屏的详细资料及使用方法,包含各项参数介绍和接口定义
CButtonST_dmo 漂亮按钮类+实例