H264 rtp封包解包
- RTP資料包格式
RTP報文頭格式(見RFC3550 Page12):
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 12 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 |
| … |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
版本(V):2位元此域定義了RTP的版本.此協議定義的版本是2.
填料§:1位元若填料位元被設定,此包包含一到多個附加在末端的填充位元,不是負載的一部分.填料的最後一個位元組包含可以忽略多少個填充位元.填料可能用於某些具有固定長度的加密演算法,或者在底層資料單元中傳輸多個RTP包.
擴充套件(X):1位元 若設定擴充套件位元,固定頭(僅)後面跟隨一個頭擴充套件.
CSRC計數(CC):4位元 CSRC計數包含了跟在固定頭後面CSRC識別符的數目.
標誌(M):1位元 標誌的解釋由具體協議規定.它用來允許在位元流中標記重要的事件,如幀範圍.規定該標誌在靜音後的第一個語音包時置位.
負載型別(PT):7位元 此域定義了負載的格式,由具體應用決定其解釋.協議可以規定負載型別碼和負載格式之間一個預設的匹配.其他的負載型別碼可以通過非RTP方法動態定義.RTP發射機在任意給定時間發出一個單獨的RTP負載型別;此域不用來複用不同的媒體流.
序列號(sequence number):16位元 每傳送一個RTP資料包,序列號加一,接收機可以據此檢測包損和重建包序列.序列號的初始值是隨機的(不可預測),以使即便在源本身不加密時(有時包要通過翻譯器,它會這樣做),對加密演算法泛知的普通文字攻擊也會更加困難.
時間標誌(timestamp):32位元 時間標誌反映了RTP資料包中第一個位元的抽樣瞬間.抽樣瞬間必須由隨時間單調和線形增長的時鐘得到,以進行同步和抖動計算.時鐘的解析度必須滿足要求的同步準確度,足以進行包到達抖動測量.時脈頻率與作為負載傳輸的資料格式獨立,在協議中或定義此格式的負載型別說明中靜態定義,也可以在通過非RTP方法定義的負載格式中動態說明.若RTP包週期性生成,可以使用由抽樣時鐘確定的額定抽樣瞬間,而不是讀系統時鐘.例如,對於固定速率語音,時間標誌鍾可以每個抽樣週期加1.若語音裝置從輸入裝置讀取覆蓋160個抽樣週期的資料塊,對於每個這樣的資料塊,時間標誌增加160,無論此塊被髮送還是被靜音壓縮. 時間標誌的起始值是隨機的,如同序列號.多個連續的RTP包可能由同樣的時間標誌,若他們在邏輯上同時產生.如屬於同一個圖象幀.若資料沒有按照抽樣的 順序傳送,連續的RTP包可以包含不單調的時間標誌,如MPEG交織圖象幀.
同步源(SSRC):32位元 SSRC域用以識別同步源.識別符號被隨機生成,以使在同一個RTP會話期中沒有任何兩個同步源有相同的SSRC識別符.儘管多個源選擇同一個SSRC識別符的概率很低,所有RTP實現工具都必須準備檢測和解決衝突.若一個源改變本身的源傳輸地址,必須選擇新的SSRC識別符,以避免被當作一個環路源.
有貢獻源(CSRC)列表:0到15項,每項32位元 CSRC列表識別在此包中負載的有貢獻源.識別符的數目在CC域中給定.若有貢獻源多於15個,僅識別15個.CSRC識別符由混合器插入,用有貢獻源的SSRC識別符.例如語音包,混合產生新包的所有源的SSRC識別符號都被陳列,以期在接收機處正確指示交談者.
注意:前12個位元組出現在每個RTP包中,僅僅在被混合器插入時,才出現CSRC識別符列表.
RTP報文擴充套件頭格式(見RFC3550 Page18):
0 1 2 3
0 1 2 3 4 56 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
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| defined by profile | length |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| header extension |
| … |
若RTP頭中的擴充套件位元位X置1,則一個長度可變的頭擴充套件部分被加到RTP固定頭之後,.頭擴充套件包含16位元的長度域,指示擴充套件項中32位元字的個數,不包括4個位元組擴充套件頭(因此零是有效值).RTP固定頭之後只允許有一個頭擴充套件.為允許多個互操作實現獨立生成不同的頭擴充套件,或某種特定實現有多種不同的頭擴充套件,擴充套件項的前16位元用以識別識別符號或引數.這16位元的格式由具體實現的上層協議定義.基本的RTP說明並不定義任何頭擴充套件本身。
- 網路抽象層單元 (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 單元的型別.
Type Packet Type name
0 沒有定義
1 不分割槽,非IDR影像的片
2 片分割槽A
3 片分割槽B
4 片分割槽C
5 IDR影像中的片
6 補充增強資訊單元(SEI)
7 SPS
8 PPS
9 序列結束
10 序列結束
11 碼流借宿
12 填充
13-23 保留
1-23 NAL unit Single NAL unit packetper H.264
24 STAP-A Single-time aggregationpacket
25 STAP-B Single-time aggregationpacket
26 MTAP16 Multi-time aggregationpacket
27 MTAP24 Multi-time aggregationpacket
28 FU-A Fragmentation unit
29 FU-B Fragmentation unit
30-31 undefined
H264 over RTP基本上分三種型別:
(1)Single NAL unit packet 也就是實際的NAL型別,可以理解為一個包就是一幀H264資料,這個在實際中是比較多的。
(2)Aggregation packet 一包資料中含有多個H264幀。
STAP-A 包內的幀含有相同的NALU-Time,沒有DON
STAP-B 包內的幀含有相同的NALU-Time,有DON
MTAP16 包內的幀含有不同的NALU-Time,timestamp offset = 16
MTAP24 包內的幀含有不同的NALU-Time,timestamp offset = 24
封裝在Aggregation packet中的 NAL單元大小為65535位元組
(3) Fragmentation unit 一幀資料被分為多個RTP包,這也是很常見的,特別是對於關鍵幀。現存兩個版本FU-A,FU-B。
實際應用就是要加上個H264 STREAM 的頭h264_stream_head =0x00,0x00,0x00,0x01 4位元組,送去解碼即可。
相關文章
- 基於Nodejs的Tcp封包和解包NodeJSTCP
- WEBRTC 接收H264 RTP資料流小結Web
- 什麼是Python解包?如何進行解包?Python
- ? 如何用 wireshark 抓包 TLS 封包TLS
- 型別 列表生成 解包型別
- tar解包時報錯
- IOS免籤封包分發原始碼iOS原始碼
- Wireshark for Mac網路分析封包工具Mac
- 流媒體傳輸協議之 RTP (上篇)協議
- 流媒體傳輸協議之 RTP(下篇)協議
- python元組如何打包和解包Python
- Python - 解包的各種騷操作Python
- Python函式——locals()解包傳參Python函式
- JavaCV FFmpeg H264編碼Java
- ffmpeg提取H264影片資料
- 優秀的檔案解包工具
- RTSP H264/HEVC 流 Wasm 播放ASM
- tcpdump抓包及tshark解包方法介紹TCP
- [H264]解密純264檔案格式解密
- 易語言,彙編,封包,圖色,先學哪個才好
- H264編碼分析及隱寫實踐
- 音視訊學習之 - H264編碼
- Python3序列賦值、序列解包詳解(下)Python賦值
- 微信小程式“反編譯”實戰(一):解包微信小程式編譯
- 我是如何入門 Rust:遊戲資源解包(一)Rust遊戲
- js對flv提取h264、aac音視訊流JS
- iOS 儲存攝像頭H264視訊流iOS
- 二開APP分發系統 一鍵免IOS免籤封包分發程式APPiOS
- Python常見面試題008. 談談python中的解包Python面試題
- Debian 二進位制檔案(華文宋體字型)打包解包
- 硬體編碼相關知識(H264,H265)
- 5┃音視訊直播系統之 WebRTC 中的協議UDP、TCP、RTP、RTCP詳解Web協議UDPTCP
- 一篇文章讀懂流媒體傳輸協議RTP、RTCP、RTSP、SRTP&SRTCP協議TCP
- swoole 當中協程的理解包括(程式、執行緒的講解)執行緒
- Android開發 - Serializable 介面對物件進行“打包”傳遞和接收後“解包”解析Android物件
- [譯] 使用多重賦值與元組解包提升 Python 程式碼的可讀性賦值Python
- camera開發系列之三 相機資料採集硬編碼h264
- windows平臺編譯CEF支援H264(MP3、MP4)超詳細Windows編譯