音視頻流媒體開發(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封包
過程?較簡單:
- 需要將aac的前7個(gè)(或9個(gè))字節(jié)的ADTS去掉,即是跳過adts header;
- 添加RTP Header;
- 添加2字節(jié)的AU_HEADER_LENGTH;
- 添加2字節(jié)的AU_HEADER;
- 從第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的載荷


注意:?個(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;