h.264 rtp打包

(2011-05-27 08:44:13)
轉載
標簽:

雜談

?

payload,H.264 RTP payload 格式
on 2011-2-18 in 博文摘選 | 0 Comment
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 單一時間的組合包
24 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 單一時間的組合包
24 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 單元模式(Single NAL Unit Packet: 一個RTP Payload 僅包含一個NAL 單元, NALU 類型號為1~23, 和H264 標準碼流非常接近.)
對于 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 組合封包模式(Aggregation packet: 一個RTP Payload 包含多個NAL 單元. 有STAP-A, STAP-B, MTAP-A, MTAP-B 四種類型, 編號依次為 24, 25, 26, 27.)
其次, 當 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).(Fragmentation unit: 一個RTP Payload 包含一個NAL 單元的一部分. 有FU-A, FU-B 兩種,分別標記為 28, 29.)
而當 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 |
+---------------+
{
1,將FU-A包根據rtp的包序號和FU-A的header字節,組成完整264幀;
2,判斷幀類型如果是idr幀,需要在幀頭加上sps和pps,格式為:
起始碼(0x00000001)+sps+起始碼+pps+起始碼+完整幀數據
3,幀末添加幀間分隔符“0x00, 0x00, 0x01, 0x09, 0x10”
4,使用網上精簡過的"ff_264_dec_vc"進行解碼。該項目不支持imgconvert,可從最新ff源碼查找
并拷貝yuv420p_to_xxx函數進行合適轉碼
}
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/254893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254893.shtml

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

相關文章

jquery live hover綁定方法

$(".select_item span").live({mouseenter:function(){$(this).addClass("hover");},mouseleave:function(){$(this).removeClass("hover");} }); 注意:jquery1.9以上版本不支持live,新方法為on 轉載于:https://www.cnblo…

HALCON示例程序vessel.hdev血管的分割與測量

小哥哥小姐姐覺得有用點個贊唄! HALCON示例程序vessel.hdev血管的分割與測量 示例程序源碼(加注釋) 關于顯示類函數解釋 dev_update_window (‘off’) dev_close_window () dev_open_window (0, 0, 512, 512, ‘black’, WindowID) set_d…

電子凸輪

CAM功能是按照一種人為預先設定的曲線關系(可以在線修改,對SEW的變頻/伺服控制器而言)來運動的控制應用。 100%速度前饋的位置控制這個觀點偶不敢茍同.典型的一些應用。比如:全自動包裝機械上,移動鋸,其實大家說的電子齒輪,指的就是一種可以調節主從速度比的同步應用…

浙南聯合訓練賽20180414

這次題目的代碼都不長,CF的一貫風格 A - Game CodeForces - 513A Two players play a simple game. Each player is provided with a box with balls. First players box contains exactly n1 balls and second players box contains exactly n2balls. In one move…

原生JS實現蘋果菜單

今天分享下用原生JS實現蘋果菜單效果,這個效果的重點有以下幾點 圖標中心點到鼠標的距離的算法 利用比例計算圖標的寬度 代碼地址:https://github.com/peng666/blogs/blob/gh-pages/menus/index.html 在線測試地址:http://peng666.github.io/…

Gym 100090D Insomnia

從 n 變到 1&#xff0c;有多少種方案&#xff1f; 打表記憶化。 1 #include <bits/stdc.h>2 3 using namespace std;4 5 int n;6 int dp[1000005];7 int dfs(int n) {8 if(n1)9 return 1; 10 if(dp[n]>0) 11 return dp[n]; 12 int cnt0;…

halcon rectangle1_domain縮減圖像域為矩形

目錄rectangle1_domain&#xff08;算子&#xff09;描述參數rectangle1_domain&#xff08;算子&#xff09; rectangle1_domain - 將圖像的域縮小為矩形。 rectangle1_domain&#xff08;Image&#xff1a;ImageReduced&#xff1a;Row1&#xff0c;Column1&#xff0c;Row…

PC+運動控制卡的控制方案

PC運動控制卡的控制方案&#xff1a; 采用PC&#xff0b;運動控制卡作為上位控制可充分利用計算機資源&#xff0c;用于運動過程、運動軌跡都比較復雜&#xff0c;且柔性比較強的機器和設備。從用戶使用的角度來看&#xff0c;基于PC機的運動控制卡主要是硬件接口&#xff08;輸…

IP/TCP/UDP/RTP/RTCP 包結構圖

IP 包頭結構: TCP 包頭結構: UDP 包頭結構: RTP 包頭結構: RTCP 包頭結構:

你可能不知道的java、python、JavaScript以及jquary循環語句的區別

一.概述 java循環語句分為四種形式&#xff0c;分別是 while, do/while, for, foreach&#xff1b; python中循環語句有兩種&#xff0c;while&#xff0c;for&#xff1b; JavaScript中循環語句有四種&#xff0c;while&#xff0c;do/while&#xff0c;for&#xff0c;for/in…

webservices系列(二)——JAX-WS文件上傳下載

新建ImgData類&#xff0c;存放文件javabean DataHandler&#xff1a;使用這個類型存放文件 XmlRootElement(name"ImaData") XmlAccessorType(XmlAccessType.FIELD) public class ImgData {private Integer id;XmlMimeType("application/octet-stream")pri…

halcon sobel邊緣檢測sobel_amp

目錄sobel_amp&#xff08;算子&#xff09;描述參數sobel_amp&#xff08;算子&#xff09; sobel_amp - 使用Sobel算子檢測邊緣&#xff08;幅度&#xff09;。 sobel_amp&#xff08;圖片&#xff1a;邊緣圖像&#xff1a;濾波器方式&#xff0c;掩膜大小:) 描述 sobel_…

es中的一些知識點記錄

1. forcemerge接口 強制段合并&#xff0c;設置為1時&#xff0c;是期望最終只有1個索引段。但實際情況是&#xff0c;合并的結果是段的總數會減少&#xff0c;但仍大于1&#xff0c;可以多次執行強制合并的命令。 設置的的目標值越小。合并消耗的時間會越久。 curl -XPOST htt…

用live555和ffplay搭建流媒體環境

用live555和ffplay搭建流媒體環境 http://bbs.chinavideo.org/viewthread.php?tid12166

如何才能優雅地書寫JS代碼

第一&#xff1a;關于匿名函數的使用 要避免全局變量泛濫&#xff0c; 可以考慮使用匿名函數&#xff0c; 把不需要在外部訪問的變量或者函數限制在一個比較小的范圍內。 例如以下代碼&#xff1a; <script> function func1(){ var list ["a", "b",…

halcon hough_lines 霍夫直線變換

目錄hough_lines&#xff08;算子&#xff09;描述參數hough_lines&#xff08;算子&#xff09; hough_lines - 借助Hough變換檢測邊緣圖像中的線條并將其返回到HNF中。 hough_lines&#xff08;RegionIn :: AngleResolution&#xff0c;Threshold&#xff0c;AngleGap&…

通過border來實現各種三角符號

很長時間沒有動筆了&#xff0c;最近學的東西很雜很亂&#xff01;又有點丟了西瓜撿芝麻&#xff0c;走馬觀花&#xff0c;瞻前顧后的感覺&#xff01; 因此&#xff0c;我決定一步步來&#xff0c;化繁為簡&#xff0c;今天就從border入手。 很多時候我們都會需要一個三角形或…

MFC封裝API

一、Win32Application Architecture 一個Win32 Application Architecture的代碼結構如下&#xff1a; LRESULT CALLBACK WinWordsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //定義回調處理消息函數 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPr…

通過閱讀 Douglas Crockford 的源碼學習如何寫 JSON parser(一)

JSON-js Douglas Crockford 是 JSON 的發明者&#xff0c;所以通過 DC 的代碼來學習 JSON 和 parser 絕對是上乘之選。這個倉庫里面有四個 JS 文件&#xff0c;今天我們先研究 json_parse.js。 json_parse 定義了如下 API&#xff1a; json_parse(string) > object json_par…

halcon gen_region_hline 繪制霍夫變換提取直線

目錄gen_region_hline&#xff08;算子&#xff09;描述gen_region_hline&#xff08;算子&#xff09; gen_region_hline - 將霍夫變換提取直線以普通形式描述的輸入行存儲為區域。 gen_region_hline( : Regions : Orientation, Distance : ) 描述 運算符gen_region_hline…