音视频流媒体开发【七十】- RTSP流媒体5-RTP之AAC封包和解包

音视频流媒体开发-目录
iOS知识点-目录
Android-目录
Flutter-目录
数据结构与算法-目录
uni-pp-目录

官⽅⽂档:
https://www.rfc-editor.org/rfc/rfc3640.html

ffmpeg:
封包:rtpenc_aac.c
解包:rtpdec_mpeg4.c

对aac进⾏rtp封包

过程⽐较简单:
  1. 需要将aac的前7个(或9个)字节的ADTS去掉,即是跳过adts header;
  2. 添加RTP Header;
  3. 添加2字节的AU_HEADER_LENGTH;
  4. 添加2字节的AU_HEADER;
  5. 从第17字节开始就是payload(去掉ADTS的aac数据)数据了

⾳频aac封包格式

RTP承载aac的格式由两部分组成:
  • 2个字节的AU-headers-length
  • n个AU-header,每个2字节
  • n个AU,是aac去掉adts的载荷
image.png

注意:⼀个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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容