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固定為15. (我也不知道這個值怎麼生成)
本文著重說明config, SizeLength, IndexLength, IndexDeltaLength的作用
config是16進位制的, 前兩個位元組1388
, 表示取樣率為22050, 1個channel, 後面的56e500
, 我也不知道是什麼鬼.
前兩個位元組的為ios-14996-3中定義的AudioSpecificConfig, 前13個bits的格式為
欄位 | 位元數 | 說明 |
---|---|---|
audioObjectType | 5 | aac的profile, 通常情況是1, 或者2 |
samplingFrequencyIndex | 4 | aac的取樣頻率的索引, 見下表 |
channelConfiguration | 4 | aac的通道數, 1~6表示為相應的通道數量, 7表示8通道 |
samplingFrequencyIndex的取值
值 | 表示的取樣頻率 |
---|---|
0 | 96000, |
1 | 88200, |
2 | 64000, |
3 | 48000, |
4 | 44100, |
5 | 32000, |
6 | 24000, |
7 | 22050, |
8 | 16000, |
9 | 12000, |
10 | 11025, |
11 | 8000, |
12 | 7350 |
15 | 表示自定義的取樣頻率, 一般不會出現 |
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包含以下資訊
- 當前的RTP包含了多少個音訊包?
- 每個音訊包的大小是多少?
- 時間戳是多少?
AU-Header資料段的格式為
總體封裝 AU-Header封裝
+--------------------+ / +------------------------+
| AU-headers-length | / | AU-size
+--------------------+ / +------------------------+
| AU-Header(1) | / |AU-Index / AU-Index-delta
+--------------------+ \ +------------------------+
| AU-Header(1) | \ | CTS-flag
+--------------------+ \ +------------------------+
| ............ | | CTS-delta
+--------------------+ +------------------------+
| AU-Header(n) | | DTS-flag
+--------------------+ +------------------------+
| padding | |DTS-delta
+--------------------+ +------------------------+
| RAP-flag
+------------------------+
| Stream-state |
+------------------------+
欄位 | 位元數 | 說明 |
---|---|---|
AU-headers-length | 0或16 | 如果沒有AU-Header, 即fmtp中不出現SizeLength等引數時, 此欄位不存在. 否則, 使用兩個位元組來儲存所有AU-Header所佔用的位元數 (不包含自己, 不包含padding欄位), 網路位元組序 |
AU-size | 由sizeLength決定 | 表示本段音訊資料佔用的位元組數 |
AU-Index | 由indexLength決定 | 表示本段的序號, 通常0開始 |
AU-Index-delta | 由indexDeltaLength決定 | 表示本段序號與上一段序號的差值 |
其它的值都是可選的, 如果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=15; mode=AAC-hbr; config=138856e500;