音視頻流媒體開發(fā)-目錄
iOS知識點-目錄
Android-目錄
Flutter-目錄
數(shù)據(jù)結(jié)構(gòu)與算法-目錄
uni-pp-目錄
官??檔:
https://www.rfc-editor.org/rfc/rfc3640.html
ffmpeg:
封包:rtpenc_aac.c
解包:rtpdec_mpeg4.c
對aac進?rtp封包
過程?較簡單:
- 需要將aac的前7個(或9個)字節(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個字節(jié)的AU-headers-length
- n個AU-header允耿,每個2字節(jié)
- n個AU,是aac去掉adts的載荷
注意:?個RTP包中可以有?個AU-headers-length 和 n個AU-header和 n個AU(AU每包實際?頻數(shù)據(jù)流)
1. AU-headers-length
頭兩個字節(jié)表示au-header的?度,單位是bit距潘。 ?個AU-header?度是兩個字節(jié)(16bit)因為可以有多個au-header所以AU-headers-length的值是 16的倍數(shù),?般?頻都是單個?頻數(shù)據(jù)流的發(fā)送只搁,所以AU-headers-length的值是16
//AU_HEADER_LENGTH
bytes[12] = 0x00; //?位
bytes[13] = 0x10; //低位 只有?個AU_HEADER
因為單位是bit, 除以8就是auHeader的字節(jié)?度音比;?因為單個auheader字節(jié)?度2字節(jié),所以再除以2就是auheader的個數(shù)氢惋。
2. AU-header
au-header的?13個bits就是?個au 的字節(jié)?度:
//AU_HEADER
bytes[14] = (byte)((len & 0x1fe0) >> 5); //?位
bytes[15] = (byte)((len & 0x1f) << 3); //低位
這樣就能得到多個au的?度
3. AU 實際的?頻數(shù)據(jù)
RTSP/SDP中的AAC配置
當(dāng)RTSP的?頻使?AAC格式時, 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對于AAC, 固定為5
profile-level-id固定為1. (我也不知道這個值怎么?成)
本?著重說明config, SizeLength, IndexLength, IndexDeltaLength的作?
config是16進制的, 前兩個字節(jié) 1388 , 表示采樣率為22050, 1個channel, 后?的 56e500 , 我也不知道是什么?.
前兩個字節(jié)的為ios-14996-3中定義的AudioSpecificConfig, 前13個bits的格式為
samplingFrequencyIndex的取值
1388 轉(zhuǎn)換成2進制為 0001 0011 1000 1000
audioObjectType為 00010 , 即 2
samplingFrequencyIndex為 0111 , 即 7 , 對應(yīng)的采樣頻率為 22050
channelConfiguration為 0001 , 表示channel數(shù)量為1
sizeLength=13; indexLength=3; indexDeltaLength=3涉及到?頻的AU Header.
AU Header解決了?個RTP包容納多個?頻包的問題
AU-Header包含以下信息
1. 當(dāng)前的RTP包含了多少個?頻包?
2. 每個?頻包的??是多少?
3. 時間戳是多少?
AU-Header數(shù)據(jù)段的格式為
其它的值都是可選的, 如果sdp中沒有出現(xiàn)相關(guān)的參數(shù)(或者為0), 則表示它們不出現(xiàn).
以最簡單的情況舉例, 假設(shè)aac數(shù)據(jù)?度為200字節(jié), 只有?個au-header.
200 的?進制為 0000011001000 . (補?為13 bits)
AU-headers-length 值為16, 因為只有?個au-header, au-header中只有AU-size和AU-Index, 共占?16bits
整個au-header數(shù)據(jù)段的內(nèi)容為
0000 0000 0000 1000 0000011001000 000
通常情況下, ?個rtp中只有?個aac包, 不需要加再AU-Header, 那么sdp中的aac參數(shù)可以簡化為
a=fmtp:96 streamtype=5; profile-level-id=1; mode=AAC-hbr; config=138856e500;