基础:

AAC⾳频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, Sony和AT&T是主要的贡献者。

AAC音频格式分两种:ADIF和ADTS:

ADIF:Audio Data Interchange Format ⾳频数据交换格式。这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中间开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘
⽂件中。
ADTS:Audio Data Transport Stream。是AAC⾳频的传输流格式。AAC⾳频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来⼜被采⽤到MPEG-4标准中。这种格式的特征是它是⼀个有同步字的⽐特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

简单说,ADTS可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF只有⼀个统⼀的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,⽬前⼀般编码后的和抽取出的都是ADTS格式的⾳频流。两者具体的组织结构如下所示:

ADIF格式

AVAudioSession 设置格式 avchd音频格式_进制

 ADTS格式(空白处表示前后帧):

AVAudioSession 设置格式 avchd音频格式_采样率_02

AAC(ADTS)音频结构: 

AVAudioSession 设置格式 avchd音频格式_进制_03

每⼀帧的ADTS的头⽂件都包含了⾳频的采样率,声道,帧⻓度等信息,这样解码器才能解析读取。
⼀般情况下ADTS的头信息都是7个字节,分为2部分:

  • adts_fixed_header();
  • adts_variable_header();

其⼀为固定头信息,紧接着是可变头信息。固定头信息中的数据每⼀帧都相同,⽽可变头信息则在帧与帧之间可变。

adts_fixed_header:

syncword:同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开始
ID:MPEG标识符,0标识MPEG-4,1标识MPEG-2
Layer:always: '00'
protection_absent:表示是否误码校验。Warning, set to 1 if there is no CRC and 0 if there is CRC
profile:表示使⽤哪个级别的AAC,如01 Low Complexity(LC)--- AAC LC。有些芯⽚只⽀持AAC LC 。

在MPEG-2 AAC中定义了3种:

index

profile

0

Main profile

1

Low Complexity profile (LC)

2

Scalable Sampling Rate profile (SSR)

3

(reserved)

sampling_frequency_index:表示使⽤的采样率下标,通过这个下标在Sampling Frequencies[ ]数组中查找得知采样率的值。

Sampling Frequency Index

Value

0x0

96000

0x1

88200

0x2

64000

0x3

48000

0x4

44100

0x5

32000

0x6

24000

0x7

22050

0x8

16000

0x9

12000

0xa

11025

0xb

8000

0xc

7350

0xd

reserved

0xe

reserved

0xf

escape value

 

 

 

 channel_configuration:

adts_variable_header:

frame_length : ⼀个ADTS帧的⻓度包括ADTS头和AAC原始流.
  aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame)
  protection_absent=0时, header length=9bytes
  protection_absent=1时, header length=7bytes
adts_buffer_fullness:0x7FF 说明是码率可变的码流。
number_of_raw_data_blocks_in_frame:表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧。
所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有⼀个AAC数据块。

下⾯是ADTS的AAC⽂件部分:
⾼字节开始算

AVAudioSession 设置格式 avchd音频格式_AVAudioSession 设置格式_04

 

 

第⼀帧的帧头7个字节为:0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC
分析各个关键数值:
111111111111
0
00
1
01
0011
0
001
0
0
0
0
0000100000111(帧⻓度)
11111111111
00
计算帧⻓度:将⼆进制 0000100000111 转换成⼗进制为263。观察第⼀帧的⻓
度确实为263个字节。
计算⽅法:(帧⻓度为13位,使⽤unsigned int来存储帧⻓数值)

unsigned int getFrameLength(unsigned char* str)
{
  if ( !str )
  {
    return 0;
  }
  unsigned int len = 0;
  int f_bit = str[3];
  int m_bit = str[4];
  int b_bit = str[5];
  len += (b_bit>>5);
  len += (m_bit<<3);
  len += ((f_bit&3)<<11);
  return len;
 }