音视频流媒体开发-目录
iOS知识点-目录
Android-目录
Flutter-目录
数据结构与算法-目录
uni-pp-目录
官⽅⽂档:
https://www.rfc-editor.org/rfc/rfc3640.html
ffmpeg:
封包:rtpenc_aac.c
解包:rtpdec_mpeg4.c
对aac进⾏rtp封包
过程⽐较简单:
- 需要将aac的前7个(或9个)字节的ADTS去掉,即是跳过adts header;
- 添加RTP Header;
- 添加2字节的AU_HEADER_LENGTH;
- 添加2字节的AU_HEADER;
- 从第17字节开始就是payload(去掉ADTS的aac数据)数据了
⾳频aac封包格式
RTP承载aac的格式由两部分组成:
- 2个字节的AU-headers-length
- n个AU-header,每个2字节
- n个AU,是aac去掉adts的载荷
注意:⼀个RTP包中可以有⼀个AU-headers-length 和 n个AU-header和 n个AU(AU每包实际⾳频数据流)
1. AU-headers-length
头两个字节表示au-header的⻓度,单位是bit。 ⼀个AU-header⻓度是两个字节(16bit)因为可以有多个au-header所以AU-headers-length的值是 16的倍数,⼀般⾳频都是单个⾳频数据流的发送,所以AU-headers-length的值是16
//AU_HEADER_LENGTH
bytes[12] = 0x00; //⾼位
bytes[13] = 0x10; //低位 只有⼀个AU_HEADER
因为单位是bit, 除以8就是auHeader的字节⻓度;⼜因为单个auheader字节⻓度2字节,所以再除以2就是auheader的个数。
2. AU-header
au-header的⾼13个bits就是⼀个au 的字节⻓度:
//AU_HEADER
bytes[14] = (byte)((len & 0x1fe0) >> 5); //⾼位
bytes[15] = (byte)((len & 0x1f) << 3); //低位
这样就能得到多个au的⻓度
3. AU 实际的⾳频数据
RTSP/SDP中的AAC配置
当RTSP的⾳频使⽤AAC格式时, SDP的内容差不多是这样的
v=0
o=- 16128587303007558182 16128587303007558182 IN IP4 WINDOWS-75IDU9Q
s=Unnamed
i=N/A
c=IN IP4 0.0.0.0
t=0 0
a=tool:vlc 3.0.5
a=recvonly
a=type:broadcast
a=charset:UTF-8
a=control:rtsp://192.168.2.195:8554/
m=audio 0 RTP/AVP 96
b=AS:128
b=RR:0
a=rtpmap:96 mpeg4-generic/22050
a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=138856e500; sizeLength=13; indexLength=3; indexDeltaLength=3; Profile=1;
a=control:rtsp://192.168.2.195:8554/trackID=4
m=video 0 RTP/AVP 96
b=AS:800
b=RR:0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42c01e;sprop-parameter-sets=Z0LAHtoCQKeX/8CgAJ/EAAADAZAAAF2qPFi6gA==,aM43IA==;
a=control:rtsp://192.168.2.195:8554/trackID=5
这些参数是由RFC规范定义的
https://tools.ietf.org/html/rfc3640
streamtype对于AAC, 固定为5
profile-level-id固定为1. (我也不知道这个值怎么⽣成)
本⽂着重说明config, SizeLength, IndexLength, IndexDeltaLength的作⽤
config是16进制的, 前两个字节 1388 , 表示采样率为22050, 1个channel, 后⾯的 56e500 , 我也不知道是什么⻤.
前两个字节的为ios-14996-3中定义的AudioSpecificConfig, 前13个bits的格式为
samplingFrequencyIndex的取值
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包容纳多个⾳频包的问题
AU-Header包含以下信息
1. 当前的RTP包含了多少个⾳频包?
2. 每个⾳频包的⼤⼩是多少?
3. 时间戳是多少?
AU-Header数据段的格式为
其它的值都是可选的, 如果sdp中没有出现相关的参数(或者为0), 则表示它们不出现.
以最简单的情况举例, 假设aac数据⻓度为200字节, 只有⼀个au-header.
200 的⼆进制为 0000011001000 . (补⾜为13 bits)
AU-headers-length 值为16, 因为只有⼀个au-header, au-header中只有AU-size和AU-Index, 共占⽤16bits
整个au-header数据段的内容为
0000 0000 0000 1000 0000011001000 000
通常情况下, ⼀个rtp中只有⼀个aac包, 不需要加再AU-Header, 那么sdp中的aac参数可以简化为
a=fmtp:96 streamtype=5; profile-level-id=1; mode=AAC-hbr; config=138856e500;