gb28181实现调研

由于工地接入的摄像头五花八门,依靠厂家提供的平台不足以满足需求。公司需要直连摄像头和NVR进行视频取流等工作,我现在进行技术调研。

首先直接搜gb28181的话,可以看到github上有一个c#的平台,用的.net core实现。然后仔细看相关文档,你会发现这玩意用了sip协议,后者开源的框架就相当多了,不过大部分是c/c++的,纯c的比较多。java的实现也有比较完整的版本,但是很久没更新了。go的话,目前还没有比较稳定的开源实现,有一些不太完整的版本。

视频流这块,用了RTP/RTCP协议,发送的是PS流,发送给客户端的话,需要转换成可以拿来直播的其他流。

换句话说,我们需要实现一个sip网关用来进行控制,和一个媒体流网关用来传输实时媒体数据。

如果想要做嵌入式网关的话,推荐用纯C版本的库(pjsip实现了sip/RTP/RTCP/RTSP等所有的功能,live555/ffmpeg和gstreamer都是C实现),自己写上层C++代码实现。

考虑开发速度可以用高等语言来写其中的一部分,那个开源的.net core就是用C#写的(但是没有流媒体相关的实现)。为了熟悉协议,也可以自己先造个轮子(工作量很大)。

值得注意的是标准的SDP协议部分使用了扩展字段y,一般开源代码并不支持,需要拿到源码!进行修改

协议解析

github上那个c#的repo里面有协议的pdf文件,可以先下载下来。以下部分内容直接引用自协议文本。

安全注册、实时视音频点播、历史视音频的回放等应用的会话控制采用IETFRFC3261规定的 Register、Invite 等请求和响应方法实现,历史视音频回放控制采用SIP扩展协议IETFRFC2976规定的INFO方法实现,前端设备控制、信息查询、报警事件通知和分发等应用的会话控制采用SIP扩展协议IETFRFC3428规定的Mesage方法实现。

这里提到的几个方法,都是SIP协议规定的内容。SIP基于TCP/UDP,在应用层是纯文本协议,类似HTTP,也可以使用证书进行加密。

类似HTTP,sip有标准的header和body。一个标准的SIP Message请求如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
To:sip:目的设备编码@目的域名
CSeq:1 Message
Cal-ID:a84b4c76e66710
Via:SIP/2.0/UDP源域名或IP地址
From:<sip:源设备编码@源域名>;tag=237f57dc
Content-Type:Application/MANSCDP+xml
Max-Forwards:69
Content-Length:消息实体的字节长度

<?xmlversion="1.0"?>
<Control>
<CmdType>DeviceControl</CmdType>
<SN>11</SN>
<DeviceID>64010000041310000345</DeviceID>
<PTZCmd>A50F4D1000001021</PTZCmd>
<Info>
<ControlPriority>5</ControlPriority>
</Info>
</Control>

注意sip是长链接协议,所以规定了标准的register流程。

经过实际调研,最终决定暂时搁置这块的开发,其实SIP服务器实现起来不难,关键是流媒体转码相关的技术水比较深。目前公司还有其他优先级更高的事情,本文等待后续更新。