PS封裝格式 GB28181協議RTP傳輸

2021-10-09 08:12:11 字數 1496 閱讀 4946

在安防行業,有個協議是無論如何都要適配的,因為公安監控網路用的就是它,它就是:gb28181。而這份協議主要由海康制定,所以除了海康其他廠商想要適配都會少許有點兒麻煩。題主前東家便是海康,這裡稍微分析下該協議幾個容易搞混的細節,記錄在此,方便以後自己查閱,也方便諸位。

1. gb28181要求的rtp流格式

首先,我們來看看i幀的ps流格式,這裡需要注意的是sps、pps之前要加上pes頭部。如下圖所示,其中綠色部分就是我們拿到的h.264裸流資料,須將它拆分成三段並在前面加上pes頭部。這一點在gb28181標準中沒有細說,需要通過分析海康ipc流才能看出。

一般情況下idr幀很大,超過了rtp的負載長度限制(1400位元組),所以上面這乙個i幀要拆分成若干包rtp分多次傳送。第一包的結構如上圖所示,第二包以後rtp的結構就簡單多了,它是這樣的:

上面提到的是i幀的情況,相比它,p/b幀的幀格式真是太簡單了,因為它既沒有sys、psm,也沒有sps、pps:

p/b幀大小一般不超過1400位元組,如果超過1400位元組,也需分成多包rtp資料進行傳輸,超出1400部分的第二包rtp結構:

2. 頭部資訊

首先是rtp包頭資訊,它一般長度為12個位元組

#define rtp_hdr_len 12

static int gb28181_make_rtp_header(char *pdata, int marker_flag, unsigned short cseq, long long curpts, unsigned int ssrc)

然後是psh頭部,它佔了14個位元組:

#define ps_hdr_len  14

static int gb28181_make_ps_header(char *pdata, unsigned long long s64scr)

#define sys_hdr_len 18

static int gb28181_make_sys_header(char *pdata)

static int gb28181_make_psm_header(char *pdata)

最後是pes頭部,它記錄了幀的時間戳,dts可以不填,如果填寫要和pts保持一致,且同一幀資料的pts要也要一樣(即sps、pps、idr的pes要一致):

#define pes_hdr_len 19

static int gb28181_make_pes_header(char *pdata, int stream_id, int payload_len, unsigned long long pts, unsigned long long dts)

關於時間戳的位元位結構,下圖表示的比較清晰:

gb28181協議 資料收集

siprfc3261 visual studio 2010下編譯osip及exosip並搭建開發環境的方法 版本3.6 使用v2008編譯libosip和libexosip 版本4.0 訪問位址 exosip2幫助文件 gbt28181開發 sip協議實踐 之windows下編譯exosip osi...

GB28181語音對講

前段時間將音訊對講功能整合我們國標平台,踩些坑記錄下來,方便後來人。gb28181 2016語音對講沒有明確規定流程,各廠家按自己的理解進行實現。先說海康的,畢竟海康 是這個行業的龍頭老大。海康攝像機接收音訊的流程如下圖1所示 圖1.海康裝置接收音訊流流程。各信令抓包如下 圖2.平台傳送broadc...

GB28181協議支援的H264的PS封裝實現

1 寫在前面 最開始接觸h264的ps封裝的時候,參考的是 關於對h264碼流的ps的封裝的相關 實現 2 封裝需要基本了解的概念 rtp 是流 實時傳輸協議,rtp頭有12個位元組 非i幀 00 00 00 01 41 sps 00 00 00 01 67 pps 00 00 00 01 68 根...