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

DMO介绍:

DirectX媒体对象(DirectX Media Objects,简称DMOs),是微软提供的一种流数

据处理COM组件。与DirectShow filter相比,DMO有很多相似之处。DMO结构简单、

易于创建和使用。

DMO使用方式:

1.是应用程序直接使用DMO

2.在DirectShow filter中的应用。这个比较简单,只是使用了一个DMO wrapper

filter。在DirectShow应用程序中,DMO是对用户透明的,所有使用DMO的工作均由

DMO wrapper filter来完成(本文主要阐述此种运用方式)。

工程目的:

在DirectShow Filter Graph中使用DMO播放wma文件

相关代码:

//初始化COM组件

CoInitialize(NULL) ;

HRESULT hr = S_FALSE ;

//创建Filter Graph

IGraphBuilder * pGraphBuilder = NULL ;

Hr

= ::CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(

void**)&pGraphBuilder) ;

ASSERT(SUCCEEDED(hr)) ;

//创建DMO wrapper filter

IBaseFilter * pDmoFilter = NULL ;

hr

= ::CoCreateInstance(CLSID_DMOWrapperFilter,NULL,CLSCTX_INPROC,IID_IBaseFil

ter,(void**)&pDmoFilter) ;

ASSERT(SUCCEEDED(hr)) ;

//获取IID_IDMOWrapperFilter接口

IDMOWrapperFilter * pDmoWrapperFilter = NULL ;

hr =

pDmoFilter->QueryInterface(IID_IDMOWrapperFilter,(void**)&pDmoWrapperFilte

r) ;

ASSERT(SUCCEEDED(hr)) ;

//初始化DMO Wrapper Filter

hr =

pDmoWrapperFilter->Init(CLSID_WMAudioDecoderDMO,DMOCATEGORY_AUDIO

_DECODER) ;

ASSERT(SUCCEEDED(hr)) ;

//将DMOWrapperFilter添加到Filter Graph

pGraphBuilder->AddFilter(pDmoFilter,L"WMA Decoder DMO") ;

//采用智能连接直接播放

hr = pGraphBuilder->RenderFile(L"D:江南.wma",NULL) ;

IMediaControl * pMediaControl = NULL ;

hr =

pGraphBuilder->QueryInterface(IID_IMediaControl,(void**)&pMediaControl) ;

//hr返回值为S_FALSE,但是仍然可以播放,暂时不知道原因

hr = pMediaControl->Run() ;

//释放COM组件

::CoUninitialize() ;

备注:

hr = pMediaControl->Run() ; //hr返回值为S_FALSE,但是仍然可以播放,暂时不

知道原因

CLSID_WMAudioDecoderDMO 定义为

const GUID CLSID_WMAudioDecoderDMO = {0x2EEB4ADF, 0x4578, 0x4D10,

{0xBC, 0xA7, 0xBB, 0x95, 0x5F, 0x56, 0x32, 0x0A}};

与CWMADecMediaObject的UUID 定义一致,本想直接使用

CLSID_CWMADecMediaObject,无奈找不到相关lib,不知道此两个CLSID之间有什么联

系,待研究

class DECLSPEC_UUID("2eeb4adf-4578-4d10-bca7-bb955f56320a")

CWMADecMediaObject;

#endif