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檔案,但其他程式則無法調用,因此,本文提供的方法就不再適用了,請讀者根據自己的需求考慮別的方案。