音視頻流媒體開發(fā)【七十】- RTSP流媒體5-RTP之AAC封包和解包

音視頻流媒體開發(fā)-目錄
iOS知識(shí)點(diǎn)-目錄
Android-目錄
Flutter-目錄
數(shù)據(jù)結(jié)構(gòu)與算法-目錄
uni-pp-目錄

官??檔:
https://www.rfc-editor.org/rfc/rfc3640.html

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

對(duì)aac進(jìn)?rtp封包

過程?較簡單:
  1. 需要將aac的前7個(gè)(或9個(gè))字節(jié)的ADTS去掉,即是跳過adts header;
  2. 添加RTP Header;
  3. 添加2字節(jié)的AU_HEADER_LENGTH;
  4. 添加2字節(jié)的AU_HEADER;
  5. 從第17字節(jié)開始就是payload(去掉ADTS的aac數(shù)據(jù))數(shù)據(jù)了

?頻aac封包格式

RTP承載aac的格式由兩部分組成:
  • 2個(gè)字節(jié)的AU-headers-length
  • n個(gè)AU-header,每個(gè)2字節(jié)
  • n個(gè)AU,是aac去掉adts的載荷
image.png

注意:?個(gè)RTP包中可以有?個(gè)AU-headers-length 和 n個(gè)AU-header和 n個(gè)AU(AU每包實(shí)際?頻數(shù)據(jù)流)

1. AU-headers-length

頭兩個(gè)字節(jié)表示au-header的?度,單位是bit。 ?個(gè)AU-header?度是兩個(gè)字節(jié)(16bit)因?yàn)榭梢杂卸鄠€(gè)au-header所以AU-headers-length的值是 16的倍數(shù),?般?頻都是單個(gè)?頻數(shù)據(jù)流的發(fā)送,所以AU-headers-length的值是16

//AU_HEADER_LENGTH
bytes[12] = 0x00; //?位
bytes[13] = 0x10; //低位 只有?個(gè)AU_HEADER

因?yàn)閱挝皇莃it, 除以8就是auHeader的字節(jié)?度;?因?yàn)閱蝹€(gè)auheader字節(jié)?度2字節(jié),所以再除以2就是auheader的個(gè)數(shù)。

2. AU-header

au-header的?13個(gè)bits就是?個(gè)au 的字節(jié)?度:

//AU_HEADER
bytes[14] = (byte)((len & 0x1fe0) >> 5); //?位
bytes[15] = (byte)((len & 0x1f) << 3); //低位

這樣就能得到多個(gè)au的?度

3. AU 實(shí)際的?頻數(shù)據(jù)

RTSP/SDP中的AAC配置

當(dāng)RTSP的?頻使?AAC格式時(shí), SDP的內(nèi)容差不多是這樣的

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

這些參數(shù)是由RFC規(guī)范定義的

https://tools.ietf.org/html/rfc3640

streamtype對(duì)于AAC, 固定為5
profile-level-id固定為1. (我也不知道這個(gè)值怎么?成)
本?著重說明config, SizeLength, IndexLength, IndexDeltaLength的作?
config是16進(jìn)制的, 前兩個(gè)字節(jié) 1388 , 表示采樣率為22050, 1個(gè)channel, 后?的 56e500 , 我也不知道是什么?.

前兩個(gè)字節(jié)的為ios-14996-3中定義的AudioSpecificConfig, 前13個(gè)bits的格式為

samplingFrequencyIndex的取值

1388 轉(zhuǎn)換成2進(jìn)制為 0001 0011 1000 1000
audioObjectType為 00010 , 即 2
samplingFrequencyIndex為 0111 , 即 7 , 對(duì)應(yīng)的采樣頻率為 22050
channelConfiguration為 0001 , 表示channel數(shù)量為1
sizeLength=13; indexLength=3; indexDeltaLength=3涉及到?頻的AU Header.
AU Header解決了?個(gè)RTP包容納多個(gè)?頻包的問題

AU-Header包含以下信息
1. 當(dāng)前的RTP包含了多少個(gè)?頻包?
2. 每個(gè)?頻包的??是多少?
3. 時(shí)間戳是多少?

AU-Header數(shù)據(jù)段的格式為


其它的值都是可選的, 如果sdp中沒有出現(xiàn)相關(guān)的參數(shù)(或者為0), 則表示它們不出現(xiàn).
以最簡單的情況舉例, 假設(shè)aac數(shù)據(jù)?度為200字節(jié), 只有?個(gè)au-header.
200 的?進(jìn)制為 0000011001000 . (補(bǔ)?為13 bits)
AU-headers-length 值為16, 因?yàn)橹挥?個(gè)au-header, au-header中只有AU-size和AU-Index, 共占?16bits

整個(gè)au-header數(shù)據(jù)段的內(nèi)容為

0000 0000 0000 1000 0000011001000 000

通常情況下, ?個(gè)rtp中只有?個(gè)aac包, 不需要加再AU-Header, 那么sdp中的aac參數(shù)可以簡化為

a=fmtp:96 streamtype=5; profile-level-id=1; mode=AAC-hbr; config=138856e500;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容