在安防AI领域,遍布城市或建筑内各个角落的摄像头是最边缘的设备,是一切AI处理和应用的数据源头。随着应用范围和场景的扩充,应用中摄像头的数量越来越大,对监控摄像头设备进行集中且有效的管控成为刚需。GB/T 28181标准作为公共安全视频监控联网系统的国家标准,受到海康、大华、英飞拓等国内大部分厂家的支持,协议覆盖摄像头、NVR、管理平台等设备。对GB/T 28181 标准的支持将会扩大各种基于视频处理智慧系统的应用范围,在实际项目中有推广和实用价值。本文提供一个通过GB/T 28181标准获取摄像头视频的演示样例,并通过样例展开所涉及到的其他内容,若因水平或对标准的认知有限导致内容有误,请指出。点击查看标准完整文本: 公共安全视频监控联网系统信息传输、交换、控制技术要求。


一. 摄像头端的配置

要使用28181标准接入摄像头,需要在摄像头端完成协议相关内容的配置,抛开传输安全,28181使用SIP协议作为信令应用层协议,使用RTP协议作为媒体传输协议。

海康威视摄像头接入Java 海康威视摄像头接入GB28181_海康威视摄像头接入Java

海康摄像头28181接入方式配置画面

海康威视摄像头接入Java 海康威视摄像头接入GB28181_客户端_02

大华摄像头28181接入方式配置画面

可以看到,需要配置的字段基本相同,概括下:SIP协议需要的本地SIP用户名、密码和端口,SPI服务器的用户名、密码、IP和端口,SIP保活的周期,服务器ID。如果对这些内容不太了解,大家可以大致看一下SIP协议文本:RFC3261。RFC3261详细规定了SIP各种事务的流程,大家并没有看到媒体传输相关的协议,因为这部分协议在SIP消息SDP段携带,在服务器和客户端之间进行商议,SDP协议的具体内容参看:RFC2327。

 


二. 视频接入流程

视频接入基本可以拆分为4个过程:1.客户端(摄像头)通过REGISTER方法相服务器注册,这个过程会验证账户和密码信息,可能会多一个消息来回(401 unauthorized和带密码信息的register);2.注册完成后,客户端向服务器发送MESSAGE进行保活和其他信息交流,消息体为XML格式,一般有Catalog和Keepalive等类型;3.服务器端收到请求后向客户端发起会话要求,标准的INVITE流程;4.客户端或者服务器端发起BYE消息结束会话。为方便大家对协议有一个直观的了解,我把一次通信过程中的网络包抓取下来,大家可以通过包分析工具查看。

 

SIP_28181.zip

海康威视摄像头接入Java 海康威视摄像头接入GB28181_服务器_03

SIP视频接入相关流程


三. 视频接入Demo实现

SIP协议在IP电话、空管ED136/137/138/139等VOIP相关领域应用广泛,其中有asterisk/FreeSwitch等开源的服务器实现,也有jsip,osip等SIP协议解析层面的开源实现。这些开源实现完整而全面,改造做demo的话工作量大门槛高,本文在实现的时候使用了https://github.com/1lann/go-sip 实现的简单框架,该框架还很不完整,但是已经实现了基本的收发SIP消息的封装,这对我们实现Demo来说已经足够,感谢开源作者。

在SIP视频接入流程中,服务器需要应答的几种消息有:REGISTER/MESSAGE/200OK,需要主动发出的消息有INVITE。因此,修改example_server.go中的主要涉及的点有:1.消息处理循环中,新增MESSAGE消息回200OK;2.服务启动的时候监听媒体接收端口;3.在摄像头完成注册后,主动发出INVITE以完成会话流程,让摄像头持续发来视频数据。下面分别介绍这3点实现。对接NVR的流程基本一致。

1.处理REGISTER消息

server/auth.go中HandleRegister()函数用于接收和处理注册消息,在这个逻辑里,有比较多的校验,最主要的是checkAuthorization()函数中的密码校验。为使得客户端(摄像头)能够顺利通过校验,在server/accounts.go中,新增摄像头配置页面中设置的帐号与密码。(也可以更直接的将鉴权过程直接避开,来者不拒)

海康威视摄像头接入Java 海康威视摄像头接入GB28181_客户端_04

新增客户端帐号密码

2.处理Message消息

Message消息的应答比较固定,直接应答200OK消息,因为我们为获取视频,可以忽略其他设备控制或状态信息。

海康威视摄像头接入Java 海康威视摄像头接入GB28181_数据_05

MESSAGE消息处理

3.处理接收到的200OK消息

200OK消息不需要应答,直接打印出消息体供调试即可。

海康威视摄像头接入Java 海康威视摄像头接入GB28181_客户端_06

200OK消息处理

4.准备好接收摄像头发来的视频数据

主动给终端发送INVITE请求后,迅速完成会话建立过程,为避免纠结于到底在什么地方开始启动视频数据接收,我们在程序启动时开始。摄像头使用RTP进行媒体数据的传输,因此在收到的UDP报文中,直接删除12字节的RTP头部,这里是偷懒的行为,正确的话需要解析RTP头部看是否携带了拓展头部,如果携带一并删除。(在端口收到视频数据后,也可以直接使用VLC播放)

海康威视摄像头接入Java 海康威视摄像头接入GB28181_数据_07

监听6000这个媒体端口,6000在INVITE中告知摄像头

5.向摄像头发起会话,开始视频传输

demo的实现比较简单直接,不使用任何无用的库,直接拼凑出SIP报文文本,然后通过UDP连接发送到摄像头。作为一个routine运行,在指定摄像头连上来之后,向摄像头发出报文,开始会话过程。

海康威视摄像头接入Java 海康威视摄像头接入GB28181_客户端_08

发给摄像头的INVITE消息(关注sdp_string)

6.终止程序,查看收到的视频

使用VLC或者FFPLAY都可以直接播放。

海康威视摄像头接入Java 海康威视摄像头接入GB28181_服务器_09

使用VLC播放ps.dat


四.Demo转应用要解决的问题

1. 稳定而健全的SIP事件状态机,这需要深入了解和实现协议,另外还需要提供统一的配置和管理中心;

2. 对复杂拓扑网络结构的支持,信令和媒体需要能够跨网络传输;

3. 安全传输的问题,信令和媒体加密;

4. 对28181协议中状态和控制相关信令的支持;