转 :aac rtmp分析

首先,rtmp封装的aac流,并不完全同于adts格式。

第一个数据包,发送4个字节,前面两个是0xAF、0x00,我看有文章写的是这个0xAF的A代表的是AAC,说明如下:

0 = Linear PCM, platform endian
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16 kHz mono
5 = Nellymoser 8 kHz mono
6 = Nellymoser
7 = G.711 A-law logarithmic PCM
8 = G.711 mu-law logarithmic PCM
9 = reserved
10 = AAC
11 = Speex
14 = MP3 8 kHz
15 = Device-specific sound

低4位的前2位代表抽样频率,二进制11代表44kHZ。第3位代表 音频用16位的。第4个bit代表声道数,0单声道,1双声道。尽管如此,实际使用发现这个AF00根本不需要更改,我用的24K采样、单声道,这个数据也是AF00没问题,关键是后面两个字节。

后面两个字节叫做AudioSpecificConfig,从最高位到最低位,分别表示:

前5位,表示编码结构类型,AAC main编码为1,LOW低复杂度编码为2,SSR为3。

接着4位,表示采样率。 按理说,应该是:0 ~ 96000, 1~88200, 2~64000, 3~48000, 4~44100, 5~32000, 6~24000, 7~ 22050, 8~16000...),通常aac固定选中44100,即应该对应为4,但是试验结果表明,当音频采样率小于等于44100时,应该选择3,而当音频采样率为48000时,应该选择2;

接着4为,表示声道数。

最后3位,固定为0吧。

在程序里面,发送rtmp的时候,初始化以后,不用自己填充这一堆数据,直接调用faacEncGetDecoderSpecificInfo,就能返回这个配置信息,很简单,2个字节的数据。


后面的AAC数据发送的时候,前面7个字节都是帧头数据,不用发送,但需要参照rtmp格式补充对应的字段个事,然后一起发送。

第一个audio data包:AAC sequence header

第二个audio data包:AAC raw

AF表示的含义:

1)第一个字节af,a就是10代表的意思是AAC,

Format of SoundData. The following values are defined:

0 = Linear PCM, platform endian

1 = ADPCM

2 = MP3

3 = Linear PCM, little endian

4 = Nellymoser 16 kHz mono

5 = Nellymoser 8 kHz mono

6 = Nellymoser

7 = G.711 A-law logarithmic PCM

8 = G.711 mu-law logarithmic PCM

9 = reserved

10 = AAC

11 = Speex

14 = MP3 8 kHz

15 = Device-specific sound

Formats 7, 8, 14, and 15 are reserved.

AAC is supported in Flash Player 9,0,115,0 and higher.

Speex is supported in Flash Player 10 and higher.


2)第一个字节中的后四位f代表如下

前2个bit的含义采样频率,这里是二进制11,代表44kHZ

Sampling rate. The following values are defined:

0 = 5.5 kHz

1 = 11 kHz

2 = 22 kHz

3 = 44 kHz

第3个bit,代表 音频用16位的

Size of each audio sample. This parameter only pertains to

uncompressed formats. Compressed formats always decode

to 16 bits internally.

0 = 8-bit samples

1 = 16-bit samples

第4个bit代表声道

Mono or stereo sound

0 = Mono sound

1 = Stereo sound

3)第2个字节
AACPacketType,这个字段来表示AACAUDIODATA的类型:0 = AAC sequence header,1 = AAC raw。第一个音频包用0,后面的都用1
当 AAC sequence header为0的码流结构参见“ISO-14496-3 Audio”中描述

*调用 GetAudioObjectType(),从码流中读取5bits,得到audioObjectType值,表示编码结构类型,AAC-LC为2

*samplingFrequenceIndex:4bits,表示音频采样率索引值,44100对于值为4

*channelConfiguration:4bits,表示音频输出声道,2为双声道

调用函数GASpecificConfig()

*frameLengthFlag:1 bit,表示IMDCT窗口长度,值为0

*dependsOnCoreCoder: 1bit,表明是否依赖corecoder,值为0

*extensionFlag: 1bit,值为0,没有扩展

syncExtensionType: 11bits,同步字,值固定为0x2b7

extensionAudioType: 5bits,扩展的audio编码结构类型,值为5,表示SBR:Spectral Band Replication

sbrPresentFlag:sbr data是否出现的标志,1bit,值为0.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值