RFC3640中對AAC進行RTP打包方式介紹

總括

RFC3640和RFC6416定義了兩種對MPEG-4 Stream的RTP封包方式。這裏只介紹對音頻碼流(即AAC)的封裝方式。先從RFC3640開始。如果有RTP打包音視頻碼流的開發經驗,下面的一些知識點,理解起來會簡單些。

RFC 3640中定義了對MPEG-4 Elementary stream(包括audio,video,mpeg4 system)通過RTP封包的方式。下面所列的是支持的MPEG4-4 Stream的類型

This specification defines a general and configurable payload structure to transport MPEG-4 elementary streams, in particular MPEG-4 audio (including speech) streams, MPEG-4 video streams and also MPEG-4 systems streams, such as BIFS (BInary Format for Scenes),OCI (Object Content Information), OD (Object Descriptor) and IPMP(Intellectual Property Management and Protection) streams.

兩個概念

1.Signaling by MIME Format Parameters

RFC 3640支持多種MPEG-4 stream及打包方式,所以需要定義MIME Format標識RTP Payload具體攜帶是哪一種stream或打包方式(如video,audio,appliation)。那麼每種MIME Format Pamraeters就是該格式下,所攜帶的碼流的參數信息。MIME Foramte Parameters並非在RTP碼流中攜帶,而是通過另外一種協議攜帶,比如最常見的就是通過sdp協議攜帶。

RFC 3640 Audio 對應的Media Type定義爲 mpeg4-generic

在rfc 3640定義了這些MIME Format Pamrameters名字及意義,具體的可以直接可以rfc 3640的第4章

2.MPEG Access Units

簡稱AU,可以理解成可解碼的最小數據單元,在audio stream中就是一個audio frame。

An MPEG Access Unit (AU) is the smallest data entity to which timing information is attributed.In the case of audio, an Access Unit may represent an audio frame and in the case of video, a picture.

RTP的封裝

  • 一個rtp包攜帶一個AU,在audio stream中就是一個audio frame
  • 一個rtp包中攜帶多個AU,一個編碼後的audio frame通常是比較小的(通常是100~300的字節),一個rtp(通常是1000個字節以上)通常是可以攜帶多個audio frame。在rtp payload中就被封裝成多個AU。
  • 一個rtp包中可攜帶一個AU的片段,多個rtp包攜帶一個AU,類似RTP打包的H264/265 FU-A模式,這種情況是針對video stream等大數據量的碼流。對audio stream來說,是不會出現這種情況的。

如下所示爲碼流結構

在這裏插入圖片描述
這裏要注意的是,這些字段並不是固定字段(按需攜帶,可有可無),所以碼流結構圖描述只是字段的名字,並沒有給出字段的位數(位數也是可變的)。這個跟常見的碼流結構定義不一樣,比如rtp for h264/h265 rfc中,對字段名和長度都進行詳細的規定。

下面逐一對字段意思進行解釋

AU Header Section

下圖是其結構圖,其中包含的字段也是可變的(字段可有可無,長度可變)

在這裏插入圖片描述

AU Header Section = AU-Headers-lengths + AU-header + Padding Bit

AU-header 可以有0~n個,爲0個時則整個AU Header Section都不會攜帶。一個AU-header對應一個AU,AU-header中包含對應AU解碼所需的一些參數信息。

AU-Headers-Lengths 固定的兩個字節的長度,表示AU-Headers的總長度(單位是位),所以AU-Headers所佔的字節數=AU-Headers-Lengths/8

Padding Bits: 所有的Au-Header的總長度必須是整數個字節,如果不夠則添加Padding Bit

AU-header

在這裏插入圖片描述
如上圖所示爲AU-header的結構及字段意義,AU-Size,AU-Index,AU-Index-delta爲固定字段,其餘的幾個字段都是碼流的參數信息,這些字段都是按需出現的如果MIME format parameter中攜帶了對應的屬性說明,則就存在對應的字段

  • AU-size:

就是整個數據幀的長度

  • AU-Index:

Indicates the serial number of the associated Access Unit

  • AU-Index-delta:

就是AU-Index

關於AU-Index和AU-Index-delta,rfc中描述的我沒琢磨清楚,按我的理解,用在AU fragement(或interleaving模式)情況下,RTP payload攜帶的是AU的分片,那麼AU-Index/AU-Index-delta就是標識分片的順序(以加1遞增)。那麼除此之外,AU攜帶一個可解碼的完整的audio frame時,AU-Index/AU-Index-delta填0即可)

打包AAC

通過RTP打包AAC,需要結合一種協議攜帶Format Parameters。最常用的是sdp,rfc 3640定義了一些具體模式的約束。這裏我們主要是關心攜帶AAC的情況。

在 section 3.3.5和3.3.6分別描述了 Low Bit-rate AAC 和 High Bit-rate AAC sdp所應攜帶的信息

  • Low Bit-rate AAC

rfc中給出如下約束:

1.The maximum size of an AAC frame in this mode is 63 octets(AAC幀的最大長度是63個字節)
2.AAC frames MUST NOT be fragmented when using this mode(這種模式下不可攜帶AAC 幀片段)

sdp攜帶參數信息的例子

m=audio 49230 RTP/AVP 96
a=rtpmap:96 mpeg4-generic/22050/1
a=fmtp:96 streamtype=5; profile-level-id=14; mode=AAC-lbr; config=
1388; sizeLength=6; indexLength=2; indexDeltaLength=2;
constantDuration=1024; maxDisplacement=5
  • High Bit-rate AAC

這種模式下AAC frame的長度有約束,最大長度爲8191個字節(音頻數據不會有這麼大)

sdp攜帶參數信息的例子

m=audio 49230 RTP/AVP 96
a=rtpmap:96 mpeg4-generic/48000/6
a=fmtp:96 streamtype=5; profile-level-id=16; mode=AAC-hbr;
config=11B0; sizeLength=13; indexLength=3;
indexDeltaLength=3; constantDuration=1024

這兩種模式的區別就是AAC Frame的大小限制。是用Low Bit-rate模式還是High Bit-rate模式,取決於AAC的編碼格式。
sizeLength,indexLength,indexDeltaLength,這3個屬性值分別描述的是AU-header中AU-size,AU-index,AU-index-delta字段所佔的字節數。是一定會攜帶的,
其它屬性則是跟碼流的參數相關的,比如config等。

總結

  1. RTP打包AAC,必須有一種協議可以攜帶Format Pamraeters,最常用的就是sdp協議
  2. 一個rtp包中可以包含一個或多個AAC frame(AU)
  3. 生成碼流結構最基礎的就是計算好AU-header-lengths和AU-header-section,及子字段AU-size,AU-index,AU-index-delta。如果具體的AAC編碼格式有額外的參數信息需要攜帶,則對照第4節在sdp中攜帶即可。

一種打包AAC的最簡方式

如果AAC編碼器產生的碼流數據是ATDS格式,那麼它已經描述了採樣率,通道解碼所需等信息,所以sdp及AU-header-section中只包括AU-header-lengths及AU-size,AU-index字段即可。

採用一個RTP包攜帶一個AAC frame的方式,那麼 AU-header-section = AU-header-lengths + AU-size + AU-index,rtp payload = AU-header-section + AU

sdp描述如下

m=audio 49230 RTP/AVP 96
a=rtpmap:96 mpeg4-generic/22050/1
a=fmtp:96 streamtype=5; profile-level-id=14; mode=AAC-lbr; sizeLength=6; indexLength=2; indexDeltaLength=2;

AU-size的長度爲6位,AU-index長度爲2,那麼AU-header-section佔一個字節

rtp payload的長度 = AU-header-lengths(兩個字節) + AU-header-section(一個字節) + AU的長度

Au-index值填爲0

這種方式也是live555對AAC打包的方式

另外當編碼器產生的AAC數據爲raw data時(不帶ATDS),只需sdp和rtp payload中攜帶解碼所需的信息的即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章