国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

live555學習筆記11-h264 RTP傳輸詳解(3)

2019-11-08 18:26:57
字體:
來源:轉載
供稿:網友
十一  h264 RTP傳輸詳解(3)

書接上回:H264FUAFragmenter又對數據做了什么呢?

[cpp] view plain copyvoid H264FUAFragmenter::doGetNextFrame()  {      if (fNumValidDataBytes == 1) {          // We have no NAL unit data currently in the buffer.  Read a new one:          fInputSource->getNextFrame(&fInputBuffer[1], fInputBufferSize - 1,                  afterGettingFrame, this, FramedSource::handleClosure, this);      } else {          // We have NAL unit data in the buffer.  There are three cases to consider:          // 1. There is a new NAL unit in the buffer, and it's small enough to deliver          //    to the RTP sink (as is).          // 2. There is a new NAL unit in the buffer, but it's too large to deliver to          //    the RTP sink in its entirety.  Deliver the first fragment of this data,          //    as a FU-A packet, with one extra 

H.264 視頻 RTP 負載格式

1. 網絡抽象層單元類型 (NALU)

NALU 頭由一個字節組成, 它的語法如下:

      +---------------+      |0|1|2|3|4|5|6|7|      +-+-+-+-+-+-+-+-+      |F|NRI|  Type   |      +---------------+

F: 1 個比特.  forbidden_zero_bit. 在 H.264 規范中規定了這一位必須為 0.

NRI: 2 個比特.  nal_ref_idc. 取 00 ~ 11, 似乎指示這個 NALU 的重要性, 如 00 的 NALU 解碼器可以丟棄它而不影響圖像的回放. 不過一般情況下不太關心

這個屬性.

Type: 5 個比特.  nal_unit_type. 這個 NALU 單元的類型. 簡述如下:

  0     沒有定義  1-23  NAL單元  單個 NAL 單元包.  24    STAP-A   單一時間的組合包  25    STAP-B   單一時間的組合包  26    MTAP16   多個時間的組合包  27    MTAP24   多個時間的組合包  28    FU-A     分片的單元  29    FU-B     分片的單元  30-31 沒有定義

2. 打包模式

  下面是 RFC 3550 中規定的 RTP 頭的結構.

       0                   1                   2                   3       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |V=2|P|X|  CC   |M|     PT      |       sequence number         |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |                           timestamp                           |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |           synchronization source (SSRC) identifier            |      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+      |            contributing source (CSRC) identifiers             |      |                             ....                              |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  負載類型 Payload type (PT): 7 bits  序列號 Sequence number (SN): 16 bits  時間戳 Timestamp: 32 bits    H.264 Payload 格式定義了三種不同的基本的負載(Payload)結構. 接收端可能通過 RTP Payload   的第一個字節來識別它們. 這一個字節類似 NALU 頭的格式, 而這個頭結構的 NAL 單元類型字段  則指出了代表的是哪一種結構,

  這個字節的結構如下, 可以看出它和 H.264 的 NALU 頭結構是一樣的.      +---------------+      |0|1|2|3|4|5|6|7|      +-+-+-+-+-+-+-+-+      |F|NRI|  Type   |      +---------------+  字段 Type: 這個 RTP payload 中 NAL 單元的類型. 這個字段和 H.264 中類型字段的區別是, 當 type  的值為 24 ~ 31 表示這是一個特別格式的 NAL 單元, 而 H.264 中, 只取 1~23 是有效的值.     24    STAP-A   單一時間的組合包  25    STAP-B   單一時間的組合包  26    MTAP16   多個時間的組合包  27    MTAP24   多個時間的組合包  28    FU-A     分片的單元  29    FU-B     分片的單元  30-31 沒有定義

  可能的結構類型分別有:

  1. 單一 NAL 單元模式     即一個 RTP 包僅由一個完整的 NALU 組成. 這種情況下 RTP NAL 頭類型字段和原始的 H.264的  NALU 頭類型字段是一樣的.

  2. 組合封包模式    即可能是由多個 NAL 單元組成一個 RTP 包. 分別有4種組合方式: STAP-A, STAP-B, MTAP16, MTAP24.  那么這里的類型值分別是 24, 25, 26 以及 27.

  3. 分片封包模式    用于把一個 NALU 單元封裝成多個 RTP 包. 存在兩種類型 FU-A 和 FU-B. 類型值分別是 28 和 29.

2.1 單一 NAL 單元模式

  對于 NALU 的長度小于 MTU 大小的包, 一般采用單一 NAL 單元模式.  對于一個原始的 H.264 NALU 單元常由 [Start Code] [NALU Header] [NALU Payload] 三部分組成, 其中 Start Code 用于標示這是一個

NALU 單元的開始, 必須是 "00 00 00 01" 或 "00 00 01", NALU 頭僅一個字節, 其后都是 NALU 單元內容.  打包時去除 "00 00 01" 或 "00 00 00 01" 的開始碼, 把其他數據封包的 RTP 包即可.

       0                   1                   2                   3       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |F|NRI|  type   |                                               |      +-+-+-+-+-+-+-+-+                                               |      |                                                               |      |               Bytes 2..n of a Single NAL unit                 |      |                                                               |      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |                               :...OPTIONAL RTP padding        |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  如有一個 H.264 的 NALU 是這樣的:

  [00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

  這是一個序列參數集 NAL 單元. [00 00 00 01] 是四個字節的開始碼, 67 是 NALU 頭, 42 開始的數據是 NALU 內容.

  封裝成 RTP 包將如下:

  [ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ]

  即只要去掉 4 個字節的開始碼就可以了.

2.2 組合封包模式

  其次, 當 NALU 的長度特別小時, 可以把幾個 NALU 單元封在一個 RTP 包中.

         0                   1                   2                   3       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |                          RTP Header                           |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |STAP-A NAL HDR |         NALU 1 Size           | NALU 1 HDR    |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |                         NALU 1 Data                           |      :                                                               :      +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |               | NALU 2 Size                   | NALU 2 HDR    |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |                         NALU 2 Data                           |      :                                                               :      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |                               :...OPTIONAL RTP padding        |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.3 Fragmentation Units (FUs).

  而當 NALU 的長度超過 MTU 時, 就必須對 NALU 單元進行分片封包. 也稱為 Fragmentation Units (FUs).         0                   1                   2                   3       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      | FU indicator  |   FU header   |                               |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |      |                                                               |      |                         FU payload                            |      |                                                               |      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+      |                               :...OPTIONAL RTP padding        |      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      Figure 14.  RTP payload format for FU-A

   The FU indicator octet has the following format:

      +---------------+      |0|1|2|3|4|5|6|7|      +-+-+-+-+-+-+-+-+      |F|NRI|  Type   |      +---------------+

   The FU header has the following format:

      +---------------+      |0|1|2|3|4|5|6|7|      +-+-+-+-+-+-+-+-+      |S|E|R|  Type   |      +---------------+

---------------------------------------------

H264FUAFragmenter中只支持single和FU-A模式,不支持其它模式.

我們現在還得出一個結論,我們可以看出RTPSink與Source怎樣分工:RTPSink只做形成通用RTP包頭的工作,各種媒體格式的Source才是實現媒體數據RTP封包的地方,其實按習慣感覺XXXRTPSink才是進行封包的地方.但是,從文件的安排上,H264FUAFragmenter被隱藏在H264VideoRTPSink中,并在程序中暗渡陳倉地把H264VideoStreamFramer替換掉,其實還是按習慣的架構(設計模式)來做的,所以如果把H264FUAFragmenter的工作移到H264VideoRTPSink中也是沒問題的.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江永县| 呼玛县| 顺平县| 海安县| 邵阳市| 大庆市| 曲阳县| 奉节县| 吉林市| 晋宁县| 诏安县| 兴和县| 赤峰市| 东乡县| 天门市| 利川市| 宁海县| 绥芬河市| 巴南区| 屏边| 航空| 舞钢市| 怀安县| 亳州市| 沙湾县| 常山县| 罗山县| 吴忠市| 江西省| 大余县| 梁平县| 溆浦县| 巴青县| 云龙县| 周至县| 岑溪市| 阿拉善右旗| 石渠县| 安溪县| 博兴县| 高清|