在Windows Mobile 5.0下播放MP3

在Windows Mobile 5.0下,系统没有提供一些简单的API来实现MP3的播放,所以就不用找文档了。
DirectShow虽然是万金油,但是系统里没有直接提供MP3解码的Filter,需要安装第三方的组件。

那么,内部的媒体播放器为什么可以播放MP3呢? 因为微软使用的是DMO。DMO是DirectX Media Objects的缩写。
Notes: 其它的媒体,如WMV/WMA播放也需要DMO。

而媒体播放器播放MP3的 DMO 组件位于:

[HKEY_CLASSES_ROOT/CLSID/{86A495AC-64CE-42DE-A13A-321ACC0F02DB}]
@=”MPEG-1 Layer 3 Decoder DMO”
“DMOGuid”=”6b928210-84e7-4930-9b33-1eb6f02b526e”
“DMOCategory”=”57f2db8b-e6bb-4513-9d43-dcd2a6593125″
“Merit”=dword:00800001
InprocServer32是 msdmo.dll
Pins:
[HKEY_CLASSES_ROOT/CLSID/{86A495AC-64CE-42DE-A13A-321ACC0F02DB}/Pins/Input/Types/{73647561-0000-0010-8000-00AA00389B71}/{00000055-0000-0010-8000-00AA00389B71}]
[HKEY_CLASSES_ROOT/CLSID/{86A495AC-64CE-42DE-A13A-321ACC0F02DB}/Pins/Output/Types/{73647561-0000-0010-8000-00AA00389B71}/{00000001-0000-0010-8000-00AA00389B71}]

尝试通过WrapperFilter添加这个DMO


IBaseFilter *pFilter = NULL;
IDMOWrapperFilter *pWrapperFilter = NULL;
DEFINE_GUID(CLSID_MP3DECODERDMO, 0x6b928210, 0x84e7, 0x4930, 0x9b, 0x33, 0x1e, 0xb6, 0xf0, 0x2b, 0x52, 0x6e);
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pFilter);
hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, (void **)&pWrapperFilter);
hr = pWrapperFilter->Init(CLSID_MP3DECODERDMO, DMOCATEGORY_AUDIO_DECODER);
hr = pGraphBuilder->AddFilter(pFilter, L"MPEG-1 Layer 3 Decoder DMO");
hr = pGraphBuilder->Render(pOutPin);

返回VFW_E_CANNOT_CONNECT。Windows Mobile 5.0平台居然连MPEG1 Stream Splitter也没提供!

那么,看来在Crossbow出来前,最好的办法就是绕过微软,使用第三方库如FMOD吧。

FMOD简介

官方网站 http://www.fmod.org/

FMOD是一个跨平台的音频库。目前支持的平台有 Win32, Win64, WinCE, Linux, Linux64, Macintosh (os8/9/10/x86), PS2, PSP, PS3, Xbox, Xbox 360,GameCube, Wii。

World of Warcraft, Call of Duty, Tony Hawks, Forza, FarCry/Crysis 等游戏即使用了FMOD。

FModEx没有对应ARMV4的LIB或DLL,所以肯定不能用了。FMOD 3.75有针对Windows CE的ARMV4代码,在Mobile系统下应该也可以使用。但是商业使用需要100$的授权费。

还有一个值得一提的是MINIFMOD 1.7,虽然只支持XM播放,但仅仅只会让你的程序增加5K大小。而且是完全开源的!在很多Keygen里你能看到它的身影。

或者通过调用Windows Media Player控件也可以:
首先需要包括头文件 #include “wmp.h”
此头文件存在与WMP SDK或AK的PUBLIC/DIGITALMEDIA目录下
在类里添加定义CComPtr<IWMPPlayer> m_spPlayer;
初始化:
 CoInitializeEx(NULL,0);
 m_spPlayer.CoCreateInstance( __uuidof(WindowsMediaPlayer),0,CLSCTX_INPROC_SERVER );
最简单的播放方法:
 m_spPlayer->put_URL( TEXT(”//1.MP3“) );
如果需要控制更多的事件,可以通过其它WMP的接口完成.比如IWMPControls就可以对歌曲进行停止/暂停/下一首等等.
清除:
 m_spPlayer.Release();
 CoUninitialize();
如果需要界面,也可以通过创建WMP的ActiveX容器完成.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值