在安防AI领域,遍布城市或建筑内各个角落的摄像头是最边缘的设备,是一切AI处理和应用的数据源头。随着应用范围和场景的扩充,应用中摄像头的数量越来越大,对监控摄像头设备进行集中且有效的管控成为刚需。GB/T 28181标准作为公共安全视频监控联网系统的国家标准,受到海康、大华、英飞拓等国内大部分厂家的支持,协议覆盖摄像头、NVR、管理平台等设备。对GB/T 28181 标准的支持将会扩大各种基于视频处理智慧系统的应用范围,在实际项目中有推广和实用价值。本文提供一个通过GB/T 28181标准获取摄像头视频的演示样例,并通过样例展开所涉及到的其他内容,若因水平或对标准的认知有限导致内容有误,请指出。点击查看标准完整文本: 公共安全视频监控联网系统信息传输、交换、控制技术要求。
要使用28181标准接入摄像头,需要在摄像头端完成协议相关内容的配置,抛开传输安全,28181使用SIP协议作为信令应用层协议,使用RTP协议作为媒体传输协议。
可以看到,需要配置的字段基本相同,概括下:SIP协议需要的本地SIP用户名、密码和端口,SPI服务器的用户名、密码、IP和端口,SIP保活的周期,服务器ID。如果对这些内容不太了解,大家可以大致看一下SIP协议文本:RFC3261。RFC3261详细规定了SIP各种事务的流程,大家并没有看到媒体传输相关的协议,因为这部分协议在SIP消息SDP段携带,在服务器和客户端之间进行商议,SDP协议的具体内容参看:RFC2327。
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的流程基本一致。
server/auth.go中HandleRegister()函数用于接收和处理注册消息,在这个逻辑里,有比较多的校验,最主要的是checkAuthorization()函数中的密码校验。为使得客户端(摄像头)能够顺利通过校验,在server/accounts.go中,新增摄像头配置页面中设置的帐号与密码。(也可以更直接的将鉴权过程直接避开,来者不拒)
Message消息的应答比较固定,直接应答200OK消息,因为我们为获取视频,可以忽略其他设备控制或状态信息。
200OK消息不需要应答,直接打印出消息体供调试即可。
主动给终端发送INVITE请求后,迅速完成会话建立过程,为避免纠结于到底在什么地方开始启动视频数据接收,我们在程序启动时开始。摄像头使用RTP进行媒体数据的传输,因此在收到的UDP报文中,直接删除12字节的RTP头部,这里是偷懒的行为,正确的话需要解析RTP头部看是否携带了拓展头部,如果携带一并删除。(在端口收到视频数据后,也可以直接使用VLC播放)
demo的实现比较简单直接,不使用任何无用的库,直接拼凑出SIP报文文本,然后通过UDP连接发送到摄像头。作为一个routine运行,在指定摄像头连上来之后,向摄像头发出报文,开始会话过程。
使用VLC或者FFPLAY都可以直接播放。
1. 稳定而健全的SIP事件状态机,这需要深入了解和实现协议,另外还需要提供统一的配置和管理中心;
2. 对复杂拓扑网络结构的支持,信令和媒体需要能够跨网络传输;
3. 安全传输的问题,信令和媒体加密;
4. 对28181协议中状态和控制相关信令的支持;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。