1. 程式人生 > >RTSP/SDP中的AAC配置

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包含以下資訊

  1. 當前的RTP包含了多少個音訊包?
  2. 每個音訊包的大小是多少?
  3. 時間戳是多少?

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;