×
Namespaces

Variants
Actions

关于AMR文件编码模式的解决方案

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
huwell 在 22 Aug 2007 创建
最后由 hamishwillee 在 15 Dec 2011 编辑
  • 设备, 软件 版本:

S60 3rd Edition

S60 3rd Edition, FP1


  • 详细描述

一个AMR文件的帧长度变化是根据AMR数据的编码模式(bit rate)来定的。当我们使用API如Audio Proxy Server(APS)来播放AMR文件时,就需要知道其帧长度,因为利用APS播放的数据序列必须每个缓冲准确包含一帧。


关于AMR编码模式的信息可以从每帧的第一个字节获取。下列代码示例演示了如何操作。


注意AMR文件总是以一个6字节信息("#!AMR\n")为开头的,下面跟着帧数据。


  • 解决方案
#define KAMRHeaderLength 6    
 
// Table containing AMR-NB frame lengths for each encoding mode
 
const TInt KAMRFrameLenTable[8] = { 13, 14, 16, 18, 20, 21, 27, 32 };
 
/******************************************************************************
 
* void ResolveAMRFrameLengthL
 
* Parameters:
 
* aFs File server session
 
* aAMRFile Path and file name of an AMR-NB file
 
* aFrameLen On return, contains the frame length
 
******************************************************************************/
 
void ResolveAMRFrameLengthL( RFs& aFs, const TDesC& aAMRFile, TInt& aFrameLen )
 
{
 
RFile file;
 
User::LeaveIfError( file.Open(aFs, aAMRFile, EFileRead|EFileStream) );
 
// Skip the header part
 
TBuf8<KAMRHeaderLength> header;
 
TInt ret = file.Read( header, KAMRHeaderLength );
 
if( ret == KErrNone )
 
{
 
file.Read( header, 1 ); // read 1st byte of the first frame
 
if( header.Length() )
 
{
 
// Resolve AMR mode (0..7) and frame length from the table
 
TInt mode = (header[0] & 0x38) >> 3; // 0x38 == 00111000
 
aFrameLen = KAMRFrameLenTable[mode];
 
}
 
}
 
file.Close();
 
}
This page was last modified on 15 December 2011, at 13:27.
55 page views in the last 30 days.
×