文档章节

DMO(DirectX Media Object)的工程创建过程及其调用方式

AK_47
 AK_47
发布于 2014/07/09 17:41
字数 895
阅读 27
收藏 0

http://www.cnblogs.com/huaping-audio/archive/2009/12/10/1620836.html

 

http://blog.csdn.net/tonxi/archive/2006/08/30/1142893.aspx

 

 

 

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类似。

 

 

 

© 著作权归作者所有

AK_47
粉丝 16
博文 533
码字总数 569998
作品 0
嘉定
程序员
私信 提问
Microsoft Kinect for Windows SDK Beta 发布

Kinect for Windows SDK Beta 是为应用程序开发者提供的编程工具,我们可以通过Windows 7 系统平台方便的使用Microsoft Kinect 设备的功能。 在Kinect for Windows SDK Beta 中包括了用于Win...

junwong
2012/03/09
383
0
【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍&第一个DirectX 11 Demo的创建

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7688515 作者:毛星云 邮箱: happylifemxy@163.com 这节笔记主要讨论DirectX 11现有...

长平狐
2012/11/12
266
0
基于maven构建多模块化的SSM框架

之前写过一篇SSM的框架整合;项目开发框架-SSM;对SSM中的一些点进行了学习记录,那篇文章也是基于maven来创建的,那么为什么又要搞一篇呢?以我当前公司项目A来说,A项目包括前台、后台子项目...

glmapper
2017/11/19
0
0
obs-studio源码分析(一):窗口、显示器(桌面)捕捉

windows下窗口、桌面捕捉有多种方式。如下: 1:使用GDI函数或者Windows Media API函数 2:使用DirectX技术 3:使用api hook技术(如D3D游戏捕捉) 4:使用图形驱动技术 obs的窗口、桌面捕捉...

balijinyi
2018/05/11
0
0
c#播放声音文件

C#中声音的播放主要有三种方法: 1.使用API函数。 2.使用SoundPlayer类播放。 3.使用DirectX进行播放。 一、使用API函数进行播放。 windows操作系统中的winmm.dll文件中封装了声音处理的函数...

科技小毛
2017/10/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
4
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
8
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
892
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部