介紹
GB28181協議指的是國家標准GB/T 28181—2016《公共安全視頻監控聯網系統信息傳輸、交換、控制技術要求》1,該標准規定了公共安全視頻監控聯網系統的互聯結構, 傳輸、交換、控制的基本要求和安全性要求, 以及控制、傳輸流程和協議接口等技術要求,是視頻監控領域的國家標准。GB28181協議信令層面使用的是SIP(Session Initiation Protocol)協議2,流媒體傳輸層面使用的是實時傳輸協議(Real-time Transport Protocol,RTP)協議3,因此可以理解為GB28181是在國際通用標准的基礎之上進行了私有化定制以滿足視頻監控聯網系統互聯傳輸的標准化需求。本文旨在說明在FFmpeg中增加對GB28181協議的支持,使其可以與支持GB28181協議的設備進行通信與控制,實現設備的注冊、保活以及流媒體的傳輸。
GB28181協議會話通道實際上使用的是SIP協議,並且在SIP協議的基礎之上做了些私有化處理。SIP是一個由IETF MMUSIC工作組開發的協議,作為標准被提議用於創建,修改和終止包括視頻,語音,即時通信,在線游戲和虛擬現實等多種多媒體元素在內的交互式用戶會話。SIP中一個比較重要的概念是用戶代理(User Agent),指的是一個SIP邏輯網絡端點,用於創建、發送、接收SIP消息並管理一個SIP會話。SIP用戶代理又可分為用戶代理客戶端UAC(User Agent Client)和用戶代理服務端UAS(User Agent Server)。UAC創建並發送SIP請求,UAS接收處理SIP請求,發送SIP響應。SIP協議會與許多其它的協議協同工作,如SIP報文內容發送會話描述協議(Session Description Protocol,SDP)4,SDP協議描述了會話所使用流媒體細節,如:使用哪個IP端口,采用哪種編解碼器等等。SIP的一個典型用途是:SIP會話傳輸一些簡單的經過報文的實時傳輸協議流,RTP本身才是語音或視頻的載體。在GB28181協議中,聯網系統在進行視音頻傳輸及控制時應建立兩個傳輸通道: 會話通道和媒體流通道。會話通道用於在設備之間建立會話並傳輸系統控制命令; 媒體流通道用於傳輸視音頻數據, 經過壓縮編碼的視音頻流采用流媒體協議RTP/RTCP傳輸
圖例:
GB28181文檔地址:
http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=469659DC56B9B8187671FF08748CEC89
GB28181相關項目:
https://gitee.com/pan648540858/wvp-GB28181-pro
https://gitee.com/qinqi/JNVS
https://github.com/GB28181/GB28181.Solution
https://gitee.com/chatop2020/AKStream?_from=gitee_search
https://github.com/ZLMediaKit/ZLMediaKit
https://gitee.com/kkkkk5G/MediaServerUI
sip協議
關於sip協議,這里使用sip通信報文配上注釋來說明會更加詳細。
1.注冊文本
攝像頭 Sip
//攝像頭發起的第一次注冊信息
REGISTER sip:34020000002000000002@192.168.6.14:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK1945009904
Route: <sip:34020000001110000011@192.168.6.14:5060;lr>
From: <sip:34020000001110000011@192.168.9.200:5060>;tag=321443940 //在這里我們可以拿到設備的id
To: <sip:34020000001110000011@192.168.9.200:5060>
Call-ID: 214776626@192.168.9.200 //這個是會話的唯一標識,回復時一定要帶這個,要不然報錯
CSeq: 1 REGISTER //這里代表第一次注冊,按照國際慣例是先回復401請求校驗信息,回復信息也要攜帶
Contact: <sip:34020000001110000011@192.168.9.200:5060>
Max-Forwards: 70
User-Agent: Dahua SIP UAS V1.0 //廠商信息
Expires: 3600 //注冊有效時間,不為代表注冊,為0時代表注銷
Content-Length: 0 //請求體長度為0,說明下面沒有數據了,沒有攜帶消息體
//服務器回復401校驗
SIP/2.0 401 Unauthorized
CSeq: 1 REGISTER //回復第一次注冊
Call-ID: 214776626@192.168.9.200 //會話id
From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880
To: <sip:34020000001110000011@192.168.9.200:5060>
Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK45766126 //這個字段直接拷貝上面的來回復
WWW-Authenticate: Digest realm="3402000000",nonce="962535b552b6e29883ff988c0065ddc2" //這里表明驗證參數,nonce這里是Call-ID+設備id的md5 ,這個值只是提供校驗的隨機數,對於怎么進行校驗,下面代碼詳解
Content-Length: 0
//攝像頭第二次注冊
REGISTER sip:34020000002000000002@192.168.6.14:5060 SIP/2.0 //留意該文本,按照空格切割,uri為第二個字符串,第一個是方法,第三個是請求版本號,類似HTTP/1.1
Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK1647127273
Route: <sip:34020000001110000011@192.168.6.14:5060;lr>
From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880
To: <sip:34020000001110000011@192.168.9.200:5060>
Call-ID: 214776626@192.168.9.200
CSeq: 2 REGISTER //第二次注冊
Contact: <sip:34020000001110000011@192.168.9.200:5060>
Authorization: Digest username="34020000001110000011", realm="3402000000", nonce="962535b552b6e29883ff988c0065ddc2", uri="sip:34020000002000000002@192.168.6.14:5060", response="77ed0f6d00ab1e0c1a871dd5e03edb65", algorithm=MD5 //加密算法 以及檢驗的參數
Max-Forwards: 70
User-Agent: Dahua SIP UAS V1.0
Expires: 3600
Content-Length: 0
//第二次校驗成功的話直接響應200 之后攝像頭會發起心跳保活
SIP/2.0 200 OK
CSeq: 2 REGISTER //回復第二次注冊
Call-ID: 214776626@192.168.9.200 //唯一會話id
From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880
To: <sip:34020000001110000011@192.168.9.200:5060>
Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK1647127273
Expires: 3600
Date: Fri, 10 Apr 2021 08:24:49 GMT
Content-Length: 0
//攝像頭回復注銷信息 這里注意Expires字段,為0代表注銷 服務器收到后直接做業務操作回復200
REGISTER sip:34020000002000000002@192.168.6.14:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK399301364
Route: <sip:34020000001110000011@192.168.6.14:5060;lr>
From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880
To: <sip:34020000001110000011@192.168.9.200:5060>
Call-ID: 214776626@192.168.9.200
CSeq: 3 REGISTER //第三次注冊
Contact: <sip:34020000001110000011@192.168.9.200:5060>
Max-Forwards: 70
User-Agent: Dahua SIP UAS V1.0
Expires: 0 //注銷
Content-Length: 0
注: 平台之間注冊不需要鑒權,直接回復ok
2.心跳文本
//攝像頭發送過來的Keepalive保活信息
MESSAGE sip:34020000002000000002@192.168.6.14:5060 SIP/2.0 //MESSAGE 方法名,類似http的get/post方法
Via: SIP/2.0/UDP 192.168.1.8:5060;rport;branch=z9hG4bK700933079 //這個不用理會,但需要拷貝該字段,回復200要用
From: <sip:34020000001110000011@192.168.1.8:5060>;tag=1896094222 //同上
To: <sip:34020000002000000002@192.168.6.14:5060> //同上
Call-ID: 78119256@192.168.1.8 //同上
CSeq: 20 MESSAGE //唯一標識
Max-Forwards: 70
User-Agent: Dahua SIP UAS V1.0
Content-Type: Application/MANSCDP+xml //消息體格式
Content-Length: 178 //消息體長度,不帶消息頭,下面會空一行才會讀到消息體,解析時注意下讀到空行
<?xml version="1.0" encoding="GB2312" ?> //編碼
<Notify>
<CmdType>Keepalive</CmdType> //注意這里的消息體,大華發送的消息體有空格的,海康的消息體不帶空格,需要做下處理,或者使用xml工具類,這里為了方便直接解析字符串
<SN>0</SN>
<DeviceID>34020000001110000011</DeviceID> //設備編號
<Status>OK</Status>
</Notify>
//服務器需要對其進行200回復,超過不回復次數就會斷流
SIP/2.0 200 OK //回復200
CSeq: 20 MESSAGE //拷貝上面心跳信息
Call-ID: 78119256@192.168.1.8 //同上
From: <sip:34020000001110000011@192.168.1.8:5060>;tag=1896094222 //同上
To: <sip:34020000002000000002@192.168.6.14:5060> //同上
Via: SIP/2.0/UDP 192.168.1.8:5060;rport;branch=z9hG4bK700933079 //同上
Content-Length: 0 //沒有消息體,直接寫0
請求
客戶端向服務端發送示例:
3.catalog
sip協議
Via: SIP/2.0/UDP 27.10.24.1:5061;branch=z9hG4bK8210143023101430fa101430b
Call-ID: 9ae8ca0e3be8ca0ee2e8ca0ea0e8ca0e16e8c@27.10.24.1
From: <sip:42010000012005000001@27.10.24.1:5061;transport=udp>;tag=63a161ccc2a161cc1ba161cc59a161cc
To: <sip:45510000012005000001@27.10.30.98;transport=udp>
CSeq: 134349445 MESSAGE
Max-Forwards: 70
Expires: 90
User-Agent: IMOS/V3
Contact: <sip:42010000012005000001@27.10.24.1:5061>
Content-Type: application/MANSCDP+xml
Content-Length: 1288
<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>Catalog</CmdType>
<SN>859327</SN>
<DeviceID>4201010303</DeviceID> //設備編號,實際是上級組織編號
<SumNum>72</SumNum>
<DeviceList Num="1">
<Item> //核心數據
<DeviceID>42010000011315000808</DeviceID> //真正的設備編號
<Name>A ��ɽ�������·��-C79</Name> //名稱
<Manufacturer>uniview</Manufacturer>
<Model>h3c</Model> //型號
<Owner>h3c</Owner> //所屬廠商
<CivilCode>4201010303</CivilCode>
<Block></Block>
<Address>27.10.24.1</Address> //來源地址
<Parental>0</Parental>
<ParentID>4201010303</ParentID> //上級編號
<SafetyWay>0</SafetyWay>
<RegisterWay>1</RegisterWay>
<CertNum>1</CertNum>
<Certifiable>0</Certifiable>
<ErrCode>400</ErrCode>
<EndTime>2011-11-11T19:46:17</EndTime>
<Secrecy>0</Secrecy>
<IPAddress>27.14.33.75</IPAddress> //設備實際地址
<Port>8800</Port>
<Password>admin</Password>
<Status>ON</Status>
<Longitude>114.306191347343</Longitude>
<Latitude>30.6136439824189</Latitude>
<Info> //設備的相關信息
<CameraType>1</CameraType>
<PTZType>1</PTZType>
<PositionType>2</PositionType>
<RoomType>1</RoomType>
<UseType>1</UseType>
<SupplyLightType>1</SupplyLightType>
<DirectionType>1</DirectionType>
<Resolution></Resolution>
<DownloadSpeed></DownloadSpeed>
<SVCSpaceSupportMode>0</SVCSpaceSupportMode>
<SVCTimeSupportMode>0</SVCTimeSupportMode>
<StreamNum>1</StreamNum></Info>
</Item>
</DeviceList>
</Response>
4.訂閱通知
訂閱通知協議
注: 訂閱通知相比catalog,主要是在head頭里面多了一個event和expires
上級平台向下級平台發送流程
上下級平台發送
一個簡單的gb28181直播預覽流程:
- 接收下級域的注冊請求
- 發送catalog請求,查看設備信息
- 選擇設備進行預覽
catalog流程: - 向下級域發送catalog請求
- 下級域回復200
- 下級域發送設備信息,可能一次只發送兩個設備的信息
- 上級域回復200
- 循環步驟3和4
向下級域發送catalog請求:
MESSAGE sip:34020000001110000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.30.173:5060;rport;branch=SrsGbB14675203
From: <sip:34020000002000000001@192.168.30.173:5060>;tag=SrsGbF87133810
To: <sip:34020000001110000001@3402000000>
Call-ID: 202015285061
CSeq: 100 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: SRS/4.0.26(Leo)
Content-Length: 149
<?xml version="1.0" encoding="UTF-8"?>
<Query>
<CmdType>Catalog</CmdType>
<SN>49013560</SN>
<DeviceID>34020000001110000001</DeviceID>
</Query>
下級域回復200:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.30.173:5060;rport=5060;branch=SrsGbB14675203
From: <sip:34020000002000000001@192.168.30.173:5060>;tag=SrsGbF87133810
To: <sip:34020000001110000001@3402000000>;tag=283848756
Call-ID: 202015285061
CSeq: 100 MESSAGE
User-Agent: Embedded Net DVR/NVR/DVS
Content-Length: 0
下級域發送設備信息:
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.30.228:5060;rport;branch=z9hG4bK1779972060
From: <sip:34020000001110000001@3402000000>;tag=1212522955
To: <sip:34020000002000000001@3402000000>
Call-ID: 1323356603
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: Embedded Net DVR/NVR/DVS
Content-Length: 902
<?xml version="1.0" encoding="gb2312"?>
<Response>
<CmdType>Catalog</CmdType>
<SN>49013560</SN>
<DeviceID>34020000001110000001</DeviceID>
<SumNum>8</SumNum>
<DeviceList Num="2">
<Item>
<DeviceID>34020000001320000001</DeviceID>
<Name>Ó©Ê¯ÔÆ</Name>
<Manufacturer>Manufacturer</Manufacturer>
<Model>Camera</Model>
<Owner>Owner</Owner>
<CivilCode>CivilCode</CivilCode>
<Address>192.168.30.200</Address>
<Parental>0</Parental>
<SafetyWay>0</SafetyWay>
<RegisterWay>1</RegisterWay>
<Secrecy>0</Secrecy>
<Status>ON</Status>
</Item>
<Item>
<DeviceID>34020000001320000002</DeviceID>
<Name>Camera 01</Name>
<Manufacturer>Manufacturer</Manufacturer>
<Model>Camera</Model>
<Owner>Owner</Owner>
<CivilCode>CivilCode</CivilCode>
<Address>192.168.30.195</Address>
<Parental>0</Parental>
<SafetyWay>0</SafetyWay>
<RegisterWay>1</RegisterWay>
<Secrecy>0</Secrecy>
<Status>ON</Status>
</Item>
</DeviceList>
</Response>
上級域回復200:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.30.228:5060;rport=5060;received=192.168.30.228;branch=z9hG4bK1779972060
From: <sip:34020000001110000001@3402000000>;tag=1212522955
To: <sip:34020000002000000001@3402000000>
CSeq: 20 MESSAGE
Call-ID: 1323356603
User-Agent: SRS/4.0.26(Leo)
Content-Length: 0
sip相關的開源項目
pjsip
https://github.com/pjsip/pjproject
jain-sip
https://gitee.com/mirrors/jain-sip
gosip
2>,流媒體平台
https://github.com/648540858/wvp-GB28181-pro/tree/wvp-28181-2.0
https://gitee.com/18010473990/wvp-GB28181/tree/wvp-28181-2.0/
3>,流媒體框架
https://github.com/xiongziliang/ZLMediaKit
其他
參考:
https://zhuanlan.zhihu.com/p/393863592
https://www.cnblogs.com/xiaxveliang/p/12434170.html
https://blog.csdn.net/sbddbfm/article/details/99095022
https://www.toutiao.com/article/6829089709172457988/?wid=1648729532579
本文主要是做一個歸納整理,日后有新的資料或許會一直更新。