使用DirectShow播放AMR文件

AMR全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。其具体的文件格式可以参考其他文章或RFC3267 RTP Payload Format for AMR and AMR-WB

AMR文件多用于NOKIA手机,其特点是由于采用了自适应多速率编码,使得文件的尽寸变得很小,是WAV文件的1/10甚至更小。因此,如果程序中能够使用AMR文件代替WAV文件,在部署的时候就会占用更小的存储空间。当然,得在音频质量和文件大小两个因素上进行权衡。

AMR文件不是Windows Mobile必须支持的文件格式,因此,要想在程序中对其进行解码播放有一定的困难。不过,由于AMR文件的广泛应用,大部分Windows Mobile手机的OEM厂商在出厂时都会选择第三方的解码器内置于手机当中,从而能够对其进行解码。因此,编程序来播放AMR文件是可行的。

我们在手机上双击AMR格式的音频文件,可以发现Windows Media Player可以对其播放,那至少可以说明手机中已经包含了相应的解码器,因此,拿出对付多媒体文件最便捷的工具——DirectShow。

声明三个接口指针
IGraphBuilder* m_pGraph;
IMediaControl* m_pControl;
IMediaEvent* m_pEvent;

获取接口地址
HRESULT hr= CoInitialize(NULL);
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&m_pGraph);
hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl);
hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pEvent);

渲染文件至输出设备,播放语音
hr = m_pGraph->RenderFile(_T("\\存储卡\\7001102.amr"), NULL);
if (SUCCEEDED(hr))
{
hr = m_pControl->Run();
if (SUCCEEDED(hr))
{
long evCode;
m_pEvent->WaitForCompletion(INFINITE, &evCode);
m_pControl->Stop();
}
}

释放接口实例
if (m_pControl)
{
m_pControl->Release();
m_pControl=NULL;
}
if (m_pEvent)
{
m_pEvent->Release();
m_pEvent=NULL;
}
if (m_pGraph)
{
m_pGraph->Release();
m_pGraph=NULL;
}
CoUninitialize();

别忘了头文件和库文件:#include "dshow.h",strmiids.lib

以上程序略去了对失败的处理部分,使用时可自行加上,另外,有些手机中带的解码器具有版权保护,虽然媒体播放器可以调用这些Filter播放AMR文件,但其他程序则无法调用,因此,本文提供的方法就不再适用了,请读者根据自己的需求考虑别的方案。

你可能感兴趣的:(编程,windows,mobile,Windows Mobile,Nokia)