RTP Payload Format for H.264 Video

H.264 RTP協議的封裝格式rfc3984
? 英文原版:http://tools.ietf.org/html/rfc3984

部分中文翻譯:

H.264 視頻 RTP 負載格式

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

NAL單元=1字節包頭+負載

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 頭type字段和原始的 H.264的NALU 頭type字段是一樣的.

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?? |
+—————+

3. SDP 參數

下面描述了如何在 SDP 中表示一個 H.264 流:

. “m=” 行中的媒體名必須是 “video”
. “a=rtpmap” 行中的編碼名稱必須是 “H264″.
. “a=rtpmap” 行中的時鐘頻率必須是 90000.
. 其他參數都包括在 “a=fmtp” 行中.

如:

m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E; sprop-parameter-sets=Z0IACpZTBYmI,aMljiA==

下面介紹一些常用的參數.

3.1 packetization-mode:
表示支持的封包模式.
當 packetization-mode 的值為 0 時或不存在時, 必須使用單一 NALU 單元模式.
當 packetization-mode 的值為 1 時必須使用非交錯(non-interleaved)封包模式.
當 packetization-mode 的值為 2 時必須使用交錯(interleaved)封包模式.
這個參數不可以取其他的值.

3.2 sprop-parameter-sets:
這個參數可以用于傳輸 H.264 的序列參數集和圖像參數 NAL 單元. 這個參數的值采用 Base64 進行編碼. 不同的參數集間用”,”號隔開.

3.3 profile-level-id:
這個參數用于指示 H.264 流的 profile 類型和級別. 由 Base16(十六進制) 表示的 3 個字節. 第一個字節表示 H.264 的 Profile 類型, 第

三個字節表示 H.264 的 Profile 級別:

3.4 max-mbps:
這個參數的值是一個整型, 指出了每一秒最大的宏塊處理速度.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js字符串、數組和數字常用方法總結

https://github.com/AnHyun/blog/issues/3 一、string 常用方法: 1.substring(start開始位置的索引,end結束位置索引) 截取的位置不包含結束位置的字符,只寫一個參數表示從開始位置截取到最后,輸入負值時將負值變為0,哪個較小作為開始位置 va…

Oracle 存儲過程錯誤之PLS-00201: 必須聲明標識符

轉自:http://blog.csdn.net/u010678947/article/details/20702149 錯誤: ORA-06550: 第 1 行, 第 7 列: PLS-00201: 必須聲明標識符ZUO.PROCE_TESTORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored 解決方法: (1&#x…

mysql中如何把兩個查詢結果列數不同并成一張表_MySQL

引言本文整理了MySQL相關的知識,方便以后查閱。 基礎架構下圖是 MySQL 的一個簡要架構圖,從下圖你可以很清晰的看到用戶的 SQL 語句在 MySQL 內部是如何執行的。 先簡單介紹一下下圖涉及的一些組件的基本作用幫助大家理解這幅圖。 - 連接器: …

JavaWeb筆記01-XML

今日內容 XML 概念語法解析 XML: 概念: Extensible Markup Language 可擴展標記語言 可擴展:標簽都是自定義的.<user><student> 功能 存儲數據 配置文件在網絡中傳輸 一個故事 由于瀏覽器之間的競爭,導致HTML發展的十分不順利 用戶:唉,這怎么報錯了呢?…

centos下如何使用sendmail發送郵件

最近在實施服務端日志監控腳本&#xff0c;需要對異常情況發送郵件通知相關責任人&#xff0c;記錄下centos通過sendmail發送郵件的配置過程。一. 安裝sendmail和mailx1、安裝sendmail&#xff1a;1): centos下可以安裝命令:yum install -y sendmail service sendmail start yu…

H.263 H.263+ Payload Type

h263 rtp協議封裝協議英文版&#xff1a;rfc4629:http://tools.ietf.org/html/rfc4629 以下文章是部分參考翻譯&#xff1a; 文章出處&#xff1a; http://blog.csdn.net/zblue78/archive/2009/04/09/4059414.aspxGeneral H.263 Payload Header The H.263 payload header is s…

OC 中 load 方法和 initialize 方法的異同

(void)load; 當類對象被引入項目時, runtime 會向每一個類對象發送 load 消息load 方法會在每一個類甚至分類被引入時僅調用一次,調用的順序:父類優先于子類, 子類優先于分類load 方法不會被類自動繼承 (void)initialize; 也是在第一次使用這個類的時候會調用這個方法 轉載于:h…

scrapy框架_Python學習之Scrapy框架

爬蟲界江湖地位No.1說起Python&#xff0c;不得不說到它的爬蟲應用&#xff0c;由于Python的短小精悍&#xff0c;用它來開發爬蟲應用是最合適不過了&#xff0c;基于Python抓取網頁的庫有很多&#xff0c;例如requests,beatifulsoup等等&#xff0c;但是要說到有哪一個框架&am…

JavaWeb筆記03-Servlet

今日內容 ServletHTTP協議Request Servlet 概念 步驟 執行原理 生命周期 Servlet3.0注解配置 Servlet的體系結構 Servlet – 接口 GenericServlet – 抽象類:將Servlet接口中其他方法做了默認空實現,只將service()方法作為抽象 將來定義Servlet類時候,可以繼承Generic…

Android開發中無處不在的設計模式——動態代理模式

繼續更新設計模式系列。寫這個模式的主要原因是近期看到了動態代理的代碼。 先來回想一下前5個模式&#xff1a; - Android開發中無處不在的設計模式——單例模式 - Android開發中無處不在的設計模式——Builder模式 - Android開發中無處不在的設計模式——觀察者模式 - A…

用于MPEG-4視聽流的RTP負載格式

MPEG-4的rtp協議封裝英文原版 RFC 3016&#xff1a;http://www.rfc-editor.org/rfc/rfc3016.txt中文翻譯&#xff1a;組織&#xff1a;中國互動出版網&#xff08;http://www.china-pub.com/&#xff09;RFC文檔中文翻譯計劃&#xff08;http://www.china-pub.com/compters/emo…

pycharm python 模板配置_windows下pycharm安裝、創建文件、配置默認模板

本文為大家分享了windows下pycharm安裝、創建文件、配置默認模板的具體步驟&#xff0c;供大家參考&#xff0c;具體內容如下步驟&#xff1a;下包 —->安裝——>創建文件—->定制模板一、下包官方地址這里有企業版和社區版&#xff0c;老司機都知道社區版是免費的&am…

JavaWeb筆記02-Tomcat

今日內容 web相關概念回顧web服務器軟件:TomcatServlet入門學習 web相關概念回顧 軟件架構 C/S: 客戶端/服務器端B/S: 瀏覽器/服務器端 資源分類 靜態資源: 所有用戶訪問后,得到的結果都是一樣的,成為靜態資源,靜態資源可以直接被瀏覽器解析 如:html, css ,JavaScript 動態資…

網上的畫板代碼收集和整理

修改后的代碼[1]為&#xff0c;少了一個} package com.example.administrator.myapplication;import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.graphics.Canvas; import an…

如何寫年終總結(轉)

很多人不重視年終總結&#xff0c;覺得是一個非常令人厭煩的任務&#xff0c;往往是應付了事&#xff0c;短短幾百字&#xff0c;對目前工作中存在的問題發現不夠&#xff0c;思考不足&#xff0c;對自己一年的評價和未來一年的定位沒有說明。造成的后果就是公司得不到來自基層…

cad移動時捕捉不到基點_CAD入門必備(一)移動和復制新手必看

cad也瘋狂前言&#xff1a;CAD繪圖之所以能夠取代手工繪圖&#xff0c;很大的一部分原因是因為它可以很方便的修改和重復利用&#xff0c;例如外參可以節省很大部分時間。而我們在使用CAD中&#xff0c;用得最頻繁的功能就是移動和復制了&#xff0c;當然這也是新手必備的其中一…

H.264軟件解碼器在PXA270平臺上的優化

羅 嶸&#xff0c;何 苦 時間:2009年04月24日摘 要&#xff1a; 研究了嵌入式系統中H.264 Baseline軟件解碼器設計和優化的問題&#xff0c;提出了四種有效的優化方法&#xff0c;并在PXA270平臺上進行了測試。測試結果顯示&#xff0c;綜合使用提出的四種方法&#xff0c;H.26…

JavaWeb筆記04-解決GET與POST亂碼問題

解決GET與POST亂碼問題: 請求的亂碼問題 GET:tomcat8版本之前,get請求會亂碼 正常文字 --> UTF-8編碼 --> 字節數組 --> ISO-8859-1 編碼 --> 亂碼文字 正常文字 <-- UTF-8編碼 <-- 字節數組 <-- ISO-8859-1 編碼 <-- 亂碼文字解決亂碼的兩種格式: …

EF架構~codeFirst從初始化到數據庫遷移

一些介紹 CodeFirst是EntityFrameworks的一種開發模式&#xff0c;即代碼優先&#xff0c;它以業務代碼為主&#xff0c;通過代碼來生成數據庫&#xff0c;并且加上migration的強大數據表比對功能來生成數據庫版本&#xff0c;讓程序開發人員不用維護數據庫的變更&#xff0c;而…

Ubuntu用戶Steam控制器不工作的解決辦法

Steam 控制器已開始送貨到世界各地游戲玩家手中&#xff0c;不過有朋友遇到 Steam 控制器在 Ubuntu 中無法正常工作&#xff0c;本文我們來介紹一下解決辦法。該解決辦法并非 Ubuntu 官方提出的最佳解決方案&#xff0c;不過還是可以臨時解決 Ubuntu 用戶 Steam 控制器不工作的…