Symbian解码AMR的方法
1、直接使用CMdaAudioOutputStream类
CMdaAudioOutputStream *iOutputStream;
在函数MaoscOpenComplete(TInt aError)中设置解码器为AMR
iOutputStream->SetDataTypeL(KMMFFourCCCodeAMR)
需要包含的头文件
#include <mda/common/audio.h>
#include <MdaAudioOutputStream.h>
需要链接的库
mediaclientaudiostream.lib
然后就可以直接使用iOutputStream->WriteL写入AMR码流。
但这种方法无法实现流式播放,可能是因为每次调用WriteL都会重新初始化解码器,回放出来的声音有问题。
2、使用CMMFCodec类解码,然后再使用CMdaAudioOutputStream类回放
CMMFDescriptorBuffer *iPcm16Buffer = CMMFDescriptorBuffer::NewL( OutputSize );
CMMFDescriptorBuffer *iAmrBuffer = CMMFDescriptorBuffer::NewL( InputSize );
CMMFCodec *iOCodec = CMMFCodec::NewL( TUid::Uid( 0x101FAF67 ) );
TDesC8* ConvertAmr2PcmL( const TDesC8& aAmrData )
{
// amr input data
iAmrBuffer->Data().Copy( aAmrData );
// decode
TCodecProcessResult result = iOCodec->ProcessL( *iAmrBuffer,
*iPcm16Buffer );
if ( ( result.iStatus == TCodecProcessResult::EProcessComplete ) &&
( result.iSrcBytesProcessed == KAmrFrameSize ) &&
( result.iDstBytesAdded == KPcmBufferSize ) )
{
// return buffer
return &( iPcm16Buffer->Data() );
}
else
return NULL;
}
需要包含的头文件
#include <mmf/server/mmfcodec.h>
需要链接的库
mmfserverbaseclasses.lib
使用CMdaAudioOutputStream的时候要注意,必须等MaoscBufferCopied被调用以后才能再
次调用WriteL,因为Symbian中没有缓冲队列的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lius1984/archive/2008/12/11/3496462.aspx