RTMP直播到FMS中的AAC音频直播

本文引用了下面几个网友的文章:

http://sun3eyes.blog.163.com/blog/#m=0&t=3&c=rtmp

http://sun3eyes.blog.163.com/blog/static/1070797922012913337667/

http://sun3eyes.blog.163.com/blog/static/107079792201291112451996/

http://blog.csdn.net/helunlixing/article/details/7417778

直播的视频用H264,音频用AAC,从FAAC里面压缩出来的一帧音频数据,要经过简单处理才能打包用RTMP协议发送到FMS上,包括保存成FLV文件,都要稍微处理一下,主要是把AAC的帧头去掉,并提取出相应的信息。

1024字节的G.711A数据,AAC一般也就300多个字节。

可以把FAAC压缩出来的帧直接保存成AAC文件,用windows7自带的播放器可以播放的,方便测试。

AAC的帧头一般7个字节,或者包含CRC校验的话9个字节,这里面包括了声音的相关参数。

结构如下:

Structure

AAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ)

Header consists of 7 or 9 bytes (without or with CRC).

Letter Length (bits) Description
A 12 syncword 0xFFF, all bits must be 1
B 1 MPEG Version: 0 for MPEG-4, 1 for MPEG-2
C 2 Layer: always 0
D 1 protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC
E 2 profile, the MPEG-4 Audio Object Type minus 1
F 4 MPEG-4 Sampling Frequency Index (15 is forbidden)
G 1 private stream, set to 0 when encoding, ignore when decoding
H 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)
I 1 originality, set to 0 when encoding, ignore when decoding
J 1 home, set to 0 when encoding, ignore when decoding
K 1 copyrighted stream, set to 0 when encoding, ignore when decoding
L 1 copyright start, set to 0 when encoding, ignore when decoding
M 13 frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)
O 11 Buffer fullness
P 2 Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame
Q 16 CRC if protection absent is 0

http://wiki.multimedia.cx/index.php?title=ADTS

其中最重要的就是E,F,H。

E就是类型了

1: AAC Main
2: AAC LC (Low Complexity)
3: AAC SSR (Scalable Sample Rate)
4: AAC LTP (Long Term Prediction)

F就是采样频率

0: 96000 Hz

    • 1: 88200 Hz
    • 2: 64000 Hz
    • 3: 48000 Hz
    • 4: 44100 Hz
    • 5: 32000 Hz
    • 6: 24000 Hz
    • 7: 22050 Hz
    • 8: 16000 Hz
    • 9: 12000 Hz
    • 10: 11025 Hz
    • 11: 8000 Hz
    • 12: 7350 Hz

      H就是声道

      1: 1 channel: front-center

    • 2: 2 channels: front-left, front-right
    • 3: 3 channels: front-center, front-left, front-right
    • 4: 4 channels: front-center, front-left, front-right, back-center
    • 5: 5 channels: front-center, front-left, front-right, back-left, back-right
    • 6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
    • 7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel

      有了这三个参数,就可以发送音频的第一帧了,然后后面的帧,把包头的7个字节去掉?,打包到RTMP协议发送就可以了。

      http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio#Audio_Object_Types

      当然发送的时候要打上RTMP的包头,数据部分用 AF 00 代替AAC的包头。长度再计算一下。时间戳用采样的时间也可以,自己另算也可以。

      //--------------------------------------------------------------------------------------------------------------//

      第一个音频包那就是AAC header.

      如:af 00 13 90。包长4个字节,解释如下,

      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

      4)第3,4个字节内容AudioSpecificConfig如下

      AAC sequence header存放的是AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。AudioSpecificConfig结构的描述非常复杂,这里我做一下简化,事先设定要将要编码的音频格式,其中,选择"AAC-LC"为音频编码,音频采样率为44100,于是AudioSpecificConfig简化为下表:

      0x13 0x90(1001110010000) 表示 ObjectProfile=2, AAC-LC,SamplingFrequencyIndex=7,ChannelConfiguration=声道2

    • AudioSpecificConfig,即为ObjectProfile,SamplingFrequencyIndex,ChannelConfiguration,TFSpecificConfig。

      其中,ObjectProfile (AAC main ~1, AAC lc ~2, AAC ssr ~3);

      SamplingFrequencyIndex (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;

      ChannelConfiguration对应的是音频的频道数目。单声道对应1,双声道对应2,依次类推。

      TFSpecificConfig的说明见标准14496-3中(1.2 T/F Audio Specific Configuration)的讲解,这里恒定的设置为0;

      索引值如下含义:

      There are 13 supported frequencies:

      • 0: 96000 Hz
      • 1: 88200 Hz
      • 2: 64000 Hz
      • 3: 48000 Hz
      • 4: 44100 Hz
      • 5: 32000 Hz
      • 6: 24000 Hz
      • 7: 22050 Hz
      • 8: 16000 Hz
      • 9: 12000 Hz
      • 10: 11025 Hz
      • 11: 8000 Hz
      • 12: 7350 Hz
      • 13: Reserved
      • 14: Reserved
      • 15: frequency is written explictly

      channel_configuration: 表示声道数

      • 0: Defined in AOT Specifc Config
      • 1: 1 channel: front-center
      • 2: 2 channels: front-left, front-right
      • 3: 3 channels: front-center, front-left, front-right
      • 4: 4 channels: front-center, front-left, front-right, back-center
      • 5: 5 channels: front-center, front-left, front-right, back-left, back-right
      • 6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
      • 7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
      • 8-15: Reserved

      后面的视频包都是AF 01 + 去除7个字节头的音频AAC数据

时间: 2024-11-07 01:59:12

RTMP直播到FMS中的AAC音频直播的相关文章

如何在Android中播放网络传输过来的AAC音频?

============问题描述============ 如何在Android中播放网络传输过来的AAC音频?每个包都有ADTS头的. ============解决方案1============ 如果是应用的话,直接设置MediaPlayer setDataSource设置为网络音频的uri,然后prepareAsync(), prepare完成后调用start不就可以了吗? framework层的话还是要用aacdecoder进行解码播放,要么用软件解码,要么用硬件解码.

如何在众多直播编码器软件中挑选适合你的直播软件

现代生活已经离不开互联网,离不开软件了. 这说法毫不夸张. 比如手机上各种APP 眼花缭乱 ,各种行业, 各种功能, 各种Logo, 各种的各种. 没有良好的整理桌面能力,是真 的不好意思让别人看到啊. 这些功能各异的APP程序大多数是免费APP.今天我们来谈谈 关于直播编码和推流的免费软件. 推荐四款笔者用过的直播编码推流软件,这些免费软件各有功能侧重点.不过最终这四 款能脱颖而出,主要是满足了以下两个基本功能: 1)  支持H264编码方式,支持MP3或者AAC编码.H.264是视频编码方式

一对一直播软件开发中,如何进行推流?

推流环节对直播链路的影响非常大,如果推流网络不稳定,就算前期在音视频处理.编码和封装上做何种优化,用户体验都会很糟糕.因此接下来,小编就以一对一直播软件开发为例,为大家讲述下推流过程中涉及的协议.实现方案等. 更多Android高级面试合集放在github上面了(更多面试文档,项目下载,源码)https://github.com/xiangjiana/androids需要更多项目下载,源码的小伙伴可以点击关于我 联系我获取 一.推流的定义 推流实际上就是在把封装好的视频和音频传输到服务器的过程.

视音频数据处理入门:AAC音频码流解析

本文继续上一篇文章的内容,介绍一个音频码流处理程序.音频码流在视频播放器中的位置如下所示. 本文中的程序是一个AAC码流解析程序.该程序可以从AAC码流中分析得到它的基本单元ADTS frame,并且可以简单解析ADTS frame首部的字段.通过修改该程序可以实现不同的AAC码流处理功能. 原理 AAC原始码流(又称为"裸流")是由一个一个的ADTS frame组成的.他们的结构如下图所示. 其中每个ADTS frame之间通过syncword(同步字)进行分隔.同步字为0xFFF(

(5)mpeg系列——aac音频

扩展名:.m4a, .m4b, .m4p, .m4v, .m4r, .3gp, .mp4, .aac 互联网媒体类型:audio/aac, audio/aacp, audio/3gpp, audio/3gpp2,audio/mp4, audio/MP4A-LATM, audio/mpeg4-generic格式:有损数据压缩 延伸自:MPEG-2 音频 标准:ISO/IEC 13818-7(MPEG-2第7部), ISO/IEC 14496-3(MPEG-4第3部) AAC(Advanced Au

AAC音频格式分析

关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音频格式分析 AAC音频格式有ADIF和ADTS: ADIF:Audio Data Interchange Format 音频数据交换格式.这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行.故这种格式常用在磁盘文件中. ADTS:Audio Data Transport St

多人语音直播系统开发中聊天室功能实现方案?

"直播+"不仅是视频.直播平台的尝试方向,也成为众多音乐平台的创新业务,而语音直播正是其中一种尝试.语音直播的用户更偏向年轻化,多为追求新鲜感的90后群体,他们有自己的行为处事方式,喜欢把孤独和无聊的时间用声音的方式宣泄.对于喜爱声音的这类群体来说,语音直播系统开发既保护了他们的隐私又让他们倍感亲切.那么从技术层面讲,多人语音直播系统开发中聊天室的功能实现需要特别注意哪些呢?一.语音直播系统开发的优势是什么?想必有人会问语音直播和传统的电台有什么不同呢?语音直播也有着自己的优势主要有以

embed标签的使用(在网页中播放各种音频视频的插件的使用)

embed标签的使用(在网页中播放各种音频视频的插件的使用) 链接地址:http://blog.csdn.net/TomyGuan/archive/2006/11/10/1377807.aspx 播放器插件使用说明: 代码:< EMBED src="music.mid"autostart="true"loop="2"width="80"height="30"> src:音乐文件的路径及文件名:(

在.NET中使用Speex -- 音频数据编解码

Speex是一套开源的音频编解码库,最新版本还包含了回音消除和防抖动等功能,如果我们想开发语音聊天或视频会议这样的系统,Speex将是一个不错的选择.到 http://www.speex.org可以下载Speex的源码(编译后的dll为libspeex.dll),最新版本为1.2.不过源码是用C++开发的,直接在.NET中使用会有诸多不便,为此,我用C#将其封装,使得编解码的调用相当简单. 由于Speex原始导出的API不是很方便C#调用,所以,在用C#封装之前,先要用C++对Speex的原始A