音频AAC编码的RTMP直播

RTMP直播,音频编码采用AAC时,需要把帧头的数据去掉。

第一个数据包,发送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个字节的数据。

char *buf;
int len;
faacEncGetDecoderSpecificInfo(hEncoder, &buf, &len);
rtmp_sendaac_spec(buf, len);
free(buf);

后面的AAC数据发送的时候,前面7个字节都是帧头数据,不用发送,把后面的数据用RTMP发出去就行了。详细代码就不贴了。

使用H264压缩视频或者桌面,使用AAC压缩音频,使用RTMP直播,使用MP4保存,整个程序就快完工了!这几天在折腾这部分代码,有没有也在做这方面工作的,欢迎交流哈!嘿嘿。。。

你可能感兴趣的:(音频AAC编码的RTMP直播)