使用DirectShow播放AMR文件
2008-02-24 19:27
375 查看
AMR全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。其具体的文件格式可以参考其他文章或RFC3267 RTP Payload Format for AMR and AMR-WB
AMR文件多用于NOKIA手机,其特点是由于采用了自适应多速率编码,使得文件的尽寸变得很小,是W***文件的1/10甚至更小。因此,如果程序中能够使用AMR文件代替W***文件,在部署的时候就会占用更小的存储空间。当然,得在音频质量和文件大小两个因素上进行权衡。
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文件,但其他程序则无法调用,因此,本文提供的方法就不再适用了,请读者根据自己的需求考虑别的方案。
AMR文件多用于NOKIA手机,其特点是由于采用了自适应多速率编码,使得文件的尽寸变得很小,是W***文件的1/10甚至更小。因此,如果程序中能够使用AMR文件代替W***文件,在部署的时候就会占用更小的存储空间。当然,得在音频质量和文件大小两个因素上进行权衡。
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文件,但其他程序则无法调用,因此,本文提供的方法就不再适用了,请读者根据自己的需求考虑别的方案。
相关文章推荐
- 使用DirectShow進行播放多媒體文件(C#)
- 如何使用DirectShow播放一个文件。
- 如何使用DirectShow播放一个文件
- C#使用DirectShow播放视频文件 [转]
- Windows Mobile 下使用DirectShow播放视频文件
- 控制台使用directshow播放一个文件
- C#使用DirectShow播放视频文件
- 关于如何获得使用[迅播播放器]播放过的电影的问题,及如何删除播放过的文件的解答(一).
- 使用API函数播放MP3等音频文件的类设计(C#)
- 为什么我的WMP无法播放音频文件,提示设备正在使用中?
- 读贴小摘《linux C/C++, 使用libflashplayer.so, 控制flash文件的播放》
- iOS 录音并播放,使用AFN发送文件
- 使用gstreamer播放的媒体文件路径带中文时的处理方法
- 在网页中插入Flv视频(Flash Video)文件使用FlashPlayer播放
- 在托管应用程序中使用 DirectShow 组件获取视频文件截图和 FourCC 信息
- Ubuntu7.04使用totem-xine,安装libxine1-ffmpeg后,rm文件播放无声问题的解决办法
- 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(二)
- 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(五)
- HTML5 API---使用WebAudio API播放音频文件
- DirectShow中例子pull模式的源filter播放大文件慢的问题