按关键词阅读:
0.引言
为了更好理解本篇文章 , 可以先阅读前面几篇文章 , 文章列表如下:
详解RTP打包AAC实战分析(1)
详解RTP协议之H264封包和解包实战
详解RTP协议之H264封包细节(1)
详细解析RTSP框架和数据包分析(1)
手把手搭建RTSP流媒体服务器
RTP协议
HLS实战之Wireshark抓包分析
HTTP实战之Wireshark抓包分析
建议:阅读本文前 , 一定要阅读前面的文章 , 只有理解了原理 , 才能够真正读懂代码 。
1.Rtp封包AAC重要步骤
把AAC数据封装成RTP包 , 有以下一些重要步骤 , 如下:
(1)读入AAC文件时 , 将AAC的前7个字节(或9个字节)的ADTS header去掉 , 跳过adts header 。
(2)添加RTP Header 。
(3)添加2字节的AU_HEADER_LENGTH , 一般是2个字节 , 也有可能大于2个字节 , 根据实际情况 , 灵活改变 。
(4)添加2字节的AU_HEADER , 一般是2个字节 , 也有可能大于2个字节 , 根据实际情况 , 灵活改变 。
(5)从第17字节开始就是payload(去掉ADTS Header的aac数据)封装数据了 。
1.1 Rtp封包AAC格式
RTP承载aac的格式 , 由如下组成:
(1)2个字节的AU-headers-length 。
(2)n个AU-header , 每个2字节 。
(3)n个AU , 是aac去掉adts的payload 。
存储格式如下:
文章插图
注意:前面的RTP header+AU_HEADER_LENGTH一般是固定结构 , AU_HEADER的个数和AU是一一对应 。 AU_HEADER_LENGTH是描述所有AU_HEADER的总bit数量 , 一般是被16整除 , 这个大小在SDP文件中会有描述 , 一般一个AU_HEADER也有16bit 。
发送数据时 , 推流协议可以自己控制 , 可以不支持那么复杂的协议 , rtp aac每次只发送一个AU , 也就只有一个AU_HEADER 。
一个packet , 一般只含1个AU 。 也有包含多个AU的情况 , 如下图 。 但实际工程项目中 , 打包的情况很少 , 根据实际情况来设计 。
文章插图
1.2 重要数据结构说明
(1)AU_HEADER_LENGTH
AU_HEADER_LENGTH表示所有au-header的长度 , 单位是Bit , 一般是2个字节 。 一个au-header的长度是2个字节 , 因为可以有多个au-header , 所以AU-Headers-Length的值是16的倍数 。 一般音频都是单个音频数据流的发送 , 所以AU_HEADER_LENGTH的值是16bit , 2个字节 。
//AU_HEADER_LENGTH
bytes[12] = 0x00; //?位
bytes[13] = 0x10; //低位 只有?个AU_HEADER
因为单位是bit, 除以8就是auHeader的字节?度;?因为单个auheader字节?度2字节 , 再除以2就是auheader的个数 , 所以只有1个 。
(2)AU-header
au-header的?13个bits就是?个au 的字节?度 , 如下所示:
//AU_HEADER
bytes[14] = (byte)((len//?位
bytes[15] = (byte)((len//低位
AU-Header数据段的格式如下图:
文章插图
1.3 实际的音频数据用AU表示
(1)当RTSP的?频使?AAC格式时, SDP文件的内容如下:
v=0o=- 16128587303007558182 16128587303007558182 IN IP4 WINDOWS-75ID U9Q s=Unnamedi=N/A 5 c=IN IP4 0.0.0.0t=0 0a=tool:vlc 3.0.5a=recvonlya=type:broadcasta=charset:UTF-8a=control:rtsp://192.168.129.15:8554/m=audio 0 RTP/AVP 96b=AS:128b=RR:0a=rtpmap:96 mpeg4-generic/22050a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config =138856e500; sizeLength=13; indexLength=3; indexDeltaLength=3; Pr ofile=1;a=control:rtsp://192.168.2.195:8554/trackID=4 m=video 0 RTP/AVP 96b=AS:800b=RR:0 a=rtpmap:96 H264/90000a=fmtp:96 packetization-mode=1;profile-level-id=42c01e;sprop-para meter-sets=Z0LAHtoCQKeX/8CgAJ/EAAADAZAAAF2qPFi6gA==,aM43IA==;a=control:rtsp://192.168.129.15:8554/trackID=5
(2)上面这些参数是符合RFC规范 , 具体链接如下:
具体界面如下:
文章插图
(3)根据上面参数 , 重点说明config, SizeLength, IndexLength, IndexDeltaLength的作? 。
前两个字节的为ios-14996-3中定义的AudioSpecificConfig, 前13个bits的格式如下表:
文章插图
samplingFrequencyIndex的取值 , 根据不同的索引 , 匹配不同的采样值 。 如下图:
文章插图
根据上面的图给出的格式 , 这里就以1388举例说明 , 1388 转换成2进制为 0001 0011 1000 1000 。
audioObjectType为 00010 , 即 2 , samplingFrequencyIndex为 0111 , 即 7 , 对应的采样频率为 22050 , channelConfiguration为 0001 , 表示channel数量为1 。
上面的sizeLength=13; indexLength=3; indexDeltaLength=3涉及到?频的AU Header.AU Header解决了?个RTP包容纳多个?频包的问题 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J310M2020.html
标题:详解RTP封包和拆包AAC实战分析(2)