SIP 协议,即 会话初始协议( Session Initiation Protocol ),是一个应用层的 点对点协议 ,用于初始、管理和终止网络中的语音和视频会话,是 GB28181 的核心之一。

按照 IETF rfc 2543 的定义:

SIP是一个基于文本的应用层控制协议,独立于底层传输协议 TCP/UDP/SCTP,用于建立、修改和终止IP网上的双方或多方多媒体会话。SIP协议借鉴了HTTP、SMTP等协议,支持代理、重定向及登记定位用户等功能,支持用户移动。通过与 rtp /RTCP、SDP、 rtsp 等协议及DNS配合,SIP支持语音、视频、数据、E-mail、状态、IM、聊天、游戏等。SIP协议可在TCP或 UDP 之上传送,由于SIP本身具有握手机制,可首选UDP。

SIP 用于设备管理,其中有两个要素 – SIP用户代理 和 SIP网络服务器。

SIP 协议虽然属于应用层协议,然而 SIP 本身并不提供任何服务。但是 SIP 是通信的基础,在 SIP 这个通信的基础上可以用来构建不同的服务。SIP 协议在建立和维持多媒体会话中,主要支持如下 5 个功能:

1)检查终端用户的位置。无论被叫方在哪里均能确保呼叫达到被叫方,进行任何描述信息到定位信息的转换;

2)检查用户参与会话的意愿程度。参与者在呼叫中能够引入其他用户加入或者取消其他用户的连接;

3)检查媒体和媒体参数,允许与呼叫有关的组在支持特性上保持一致;

4)在呼叫与被叫双方建立会话;

5)发送和终止会话,修改会话参数,激活服务等会话管理操作;

GB28181流传输几种模式

UDP

服务端监听UDP端口,通过INVITE信令告知设备端口,设备主动向服务端发起流传输

tcp 被动

服务端监听TCP端口,通过INVITE信令告知设备端口,设备向服务端发起流传输

TCP 主动

设备端告知服务端监听的TCP端口情况,服务端主动向设备拉流,此种场景较少,且设备所在网络可以被服务所在网络访问(如下级设备与上级GB28181服务在同一个局域网,或者都在 公网 上能相互访问)。

smarteye 流媒体服务软件: 提供用户管理及Web可视化页面管理; 提供设备状态管理,可实时查看设备是否掉线等信息; 实时流媒体处理,PS(TS)转ES; 设备状态监测、云台控制、录像检索、回放; 提供RTSP、 RTMP 、HTTP-FLV、HLS等多种协议流输出; 对外提供服务器获取状态、信息,控制等HTTP restful API接口。

支持本地、内网、私有云部署;为企业视频能力建设,提供了视频点播转码、手机直播推流、云端录像存储计划、RTMP拉流推流服务、RTSP拉流推流服务、设备GB28181接入、Onvif云台控制等等能力,同时提供性能强大稳定的RTMP/HLS/RTSP/HTTP-FLV分发,支持H5页面无插件直播,强大的后台管理,详细的二次开发接口文档,服务搭建简单解压后一键启动,支持Windows和 Linux 环境部署

视频监控安防平台-GB28181_2016版本-INVITE请求视频(UDP、TCP active、 TCP passive)

在GB28181里面,视频请求是最重要的环节,GB28181 2016版本最主要的新增内容 估计就是请求视频的时候支持tcp active和tcp passive, 其实早在GB28181 2014版本的时候都已经定义了tcp传输码流,tcp最大的好处就是对下载的时候能保证不丢包,下面简要说一下INVITE请求视频的流程.

GB/T28181

国标GB/T28181协议全称《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是一个定义视频联网传输和设备控制标准的白皮书,由公安部科技信息化局提出,该标准规定了城市监控报警联网系统中信息传输、交换、控制的互联结构、 通信协议 结构,传输、交换、控制的基本要求和安全性要求,以及控制、传输流程和协议接口等技术要求。解决了视频间互联互通,数据共享,以及设备控制的问题,这个问题从顶层解决了视频信息各自为战的问题,打通了视频联网的信息孤岛。

优势:GB28181相对RTMP,支持TCP和UDP模式,信令流负责session交互,数据流负责数据传输,适合标准协议规范的平台级产品对接。

除了支持常规的数据接入外,还支持针对摄像机的 PTZ 控制,支持标准28181服务对接。

劣势:外部支持GB28181的服务器不多,开源如SRS服务器针对GB28181的支持暂不够商用级,期待后续版本升级支持更好。

以海康摄像头对接28281平台为例,具体交互流程如下:

REGISTER SIP :34020000002000000001@3402000000 SIP/2.0

Via: S IP /2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK1624213340

From: <sip:34020000001110000044@3402000000>;tag=2045629479

To: <sip:34020000001110000044@3402000000>

Call-ID: 1367363228

CSeq: 1 REGISTER

Contact: <sip:34020000001110000044@192.168.0.120:15068>

Max-Forwards: 70

User-Agent: IP Camera

Expires: 3600

Content-Length: 0

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK1624213340

From: <sip:34020000001110000044@3402000000>;tag=2045629479

To: <sip:34020000001110000044@3402000000>;tag=993246605

CSeq: 1 REGISTER

Call-ID: 1367363228

User-Agent: LiveGBS v210723

Contact: <sip:34020000001110000044@192.168.0.120:15068>

Content-Length: 0

Date: 2021-08-13T10:14:11.789

Expires: 3600

MESSAGE sip:34020000001110000044@3402000000 SIP/2.0

Via: SIP/2.0/UDP 192.168.0.199:15060;rport;branch=z9hG4bK796247609

From: <sip:34020000002000000001@3402000000>;tag=180247609

To: <sip:34020000001110000044@3402000000>

Call-ID: 807247609

CSeq: 2 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: LiveGBS v210723

Content-Length: 157

<?xml version=”1.0″ encoding=”GB2312″?>

<Query>

< Cmd Type>Catalog</CmdType>

<SN>552247609</SN>

<DeviceID>34020000001110000044</DeviceID>

</Query>

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.0.199:15060;rport=15060;branch=z9hG4bK796247609

From: <sip:34020000002000000001@3402000000>;tag=180247609

To: <sip:34020000001110000044@3402000000>;tag=1518451596

Call-ID: 807247609

CSeq: 2 MESSAGE

User-Agent: IP Camera

Content-Length: 0

MESSAGE sip:34020000002000000001@3402000000 SIP/2.0

Via: SIP/2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK138770826

From: <sip:34020000001110000044@3402000000>;tag=2116434170

To: <sip:34020000002000000001@3402000000>

Call-ID: 111408894

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: IP Camera

Content-Length: 590

<?xml version=”1.0″ encoding=”GB2312″?>

<Response>

<CmdType>Catalog</CmdType>

<SN>552247609</SN>

<DeviceID>34020000001110000044</DeviceID>

<SumNum>1</SumNum>

<DeviceList Num=”1″>

<Item>

<DeviceID>34020000001320000001</DeviceID>

<Name>Camera 01</Name>

<Manufacturer>Hikvision</Manufacturer>

<Model>IP Camera</Model>

<Owner>Owner</Owner>

<CivilCode>CivilCode</CivilCode>

<Address>Address</Address>

<Parental>0</Parental>

<ParentID>34020000001110000044</ParentID>

<SafetyWay>0</SafetyWay>

<RegisterWay>1</RegisterWay>

<Secrecy>0</Secrecy>

<Status>ON</Status>

</Item>

</DeviceList>

</Response>

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK138770826

From: <sip:34020000001110000044@3402000000>;tag=2116434170

To: <sip:34020000002000000001@3402000000>;tag=514247616

CSeq: 20 MESSAGE

Call-ID: 111408894

User-Agent: LiveGBS v210723

Content-Length: 0

MESSAGE sip:34020000002000000001@3402000000 SIP/2.0

Via: SIP/2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK1946244729

From: <sip:34020000001110000044@3402000000>;tag=1705757152

To: <sip:34020000002000000001@3402000000>

Call-ID: 1030239866

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: IP Camera

Content-Length: 177

<?xml version=”1.0″ encoding=”GB2312″?>

<Notify>

<CmdType>Keepalive</CmdType>

<SN>11</SN>

<DeviceID>34020000001110000044</DeviceID>

<Status>OK</Status>

<Info>

</Info>

</Notify>

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK1946244729

From: <sip:34020000001110000044@3402000000>;tag=1705757152

To: <sip:34020000002000000001@3402000000>;tag=334251619

CSeq: 20 MESSAGE

Call-ID: 1030239866

User-Agent: LiveGBS v210723

Content-Length: 0

MESSAGE sip:34020000002000000001@3402000000 SIP/2.0

Via: SIP/2.0/UDP 192.168.0.120:15068;rport;branch=z9hG4bK1402863583

From: <sip:34020000001110000044@3402000000>;tag=754663007

To: <sip:34020000002000000001@3402000000>

Call-ID: 187348500

CSeq: 20 MESSAGE

Content-Type: Application/MANSCDP+xml

Max-Forwards: 70

User-Agent: IP Camera

Content-Length: 177

<?xml version=”1.0″ encoding=”GB2312″?>

<Notify>

<CmdType>Keepalive</CmdType>

<SN>12</SN>

<DeviceID>34020000001110000044</DeviceID>

<Status>OK</Status>

<Info>

</Info>

</Notify>

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.0.120:15068;rport=15068;received=192.168.0.120;branch=z9hG4bK1402863583

From: <sip:34020000001110000044@3402000000>;tag=754663007

To: <sip:34020000002000000001@3402000000>;tag=959261639

CSeq: 20 MESSAGE

Call-ID: 187348500

User-Agent: LiveGBS v210723

Content-Length: 0

RTSP推送

rtsp推送相关的资料和测试软件比较少,支持RTSP TCP模式和UDP模式,除非对接第三方平台,不建议使用RTSP推送。

具体流程如下:

1. rtsp推送流程.

主要分两部分:第一部分先发送 信令 ;第二部分发送rtp包。

信令流程:

1.1 先发送OPTIONS, OPTIONS比较常用,就不做详细说明了。

1.2 发送ANNOUNCE, 发送ANNOUNCE主要是把要推送的音视频信息通过sdp格式传给服务器。关于sdp信息如何构造,对于h264请参考rfc6184. h265请参考rfc7798. 下面举两个例子.

h264+aac ANNOUNCE:

ANNOUNCE rtsp://192.168.0.188:554/livexxxx.sdp RTSP/1.0

Content-Type: application/sdp

CSeq: 2

User-Agent: xxxyyy

Content-Length: 489

v=0

o=- 0 0 IN IP4 127.0.0.1

s=dddookkk

c=IN IP4 192.168.0.188

t=0 0

m=video 0 RTP/AVP 96

a=rtpmap:96 H264/90000

a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z00AKp2oHgCJ+WbgIC aO AAADAAgAAAMBlCA=,aO48gA==; profile-level-id=4D002A

a=control:streamid=0

m=audio 0 RTP/AVP 97

a=rtpmap:97 MPEG4-GENERIC/44100/1

a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1208

a=control:streamid=1

h265(hevc) + AAC ANNOUNCE:

ANNOUNCE rtsp://192.168.0.174:554/live3.sdp RTSP/1.0

Content-Type: application/sdp

CSeq: 2

User-Agent: mmmmd

Content-Length: 364

v=0

o=- 0 0 IN IP4 127.0.0.1

s=uvsdewewe

c=IN IP4 192.168.0.174

t=0 0

m=video 0 RTP/AVP 96

a=rtpmap:96 H265/90000

a=control:streamid=0

m=audio 0 RTP/AVP 97

a=rtpmap:97 MPEG4-GENERIC/44100/1

a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1208

a=control:streamid=1

1.3 发送 SETUP,这个和播放基本一样,请参考播放流程.

1.4 发送 RECORD,record之后,信令流程完成, 接下来发送rtp包即可。

关于rtp包的构造,h264 参考rfc6184。 h265参考 rfc7798。

以Android平台为例,相关接口设计如下:

/*+++++++++++++++推送rtsp相关接口+++++++++++++++*/

/*

* 设置推送rtsp传输方式

*

* @param transport_protocol: 1表示UDP传输rtp包; 2表示TCP传输rtp包. 默认是1, UDP传输. 传其他值SDK报错。

*

* @return {0} if successful

*/

public native int SetPushRtspTransportProtocol(long handle, int transport_protocol);

/*

* 设置推送RTSP的URL

*

* @param url: 推送的RTSP url

*

* @return {0} if successful

*/

public native int SetPushRtspURL(long handle, String url);

/*

* 启动推送RTSP流

*

* @param reserve: 保留参数,传0

*

* @return {0} if successful

*/

public native int StartPushRtsp(long handle, int reserve);

/*

* 停止推送RTSP流

*

* @return {0} if successful

*/

public native int StopPushRtsp(long handle);

/*—————推送rtsp相关接口—————*/

RTMP推送

RTMP采用的是TCP传输,采用全自研框架,易于扩展,自适应算法让延迟更低、采集编码传输效率更高。延迟配合大牛直播SDK(官方)的播放器,依然可以实现毫秒级。

跨平台设计如下:

[本地预览]Windows平台支持摄像头/屏幕/合成数据实时预览功能,Android/iOS平台支持本地前后置摄像头预览;

[摄像头反转/旋转]Windows平台支持摄像头水平反转、垂直反转、0°/90°/180°/270°旋转;

[摄像头采集]除常规YUV格式外,Windows平台还支持MJPEG格式的摄像头采集;

[麦克风/扬声器采集]Windows平台音频输入端支持麦克风、扬声器,或麦克风和扬声器混音输入;

[RTMP推流]超低延时的RTMP协议直播推流SDK(Windows/Android/iOS支持RTMP扩展H.265推送);

[视频格式]Windows/Android平台支持H.264/H.265编码(Android H.265硬编码),iOS平台支持H.264编码;

[音频格式]Windows/Android/iOS平台支持AAC编码,Windows/Android平台支持Speex编码;

[ 音频编码 ]Windows/Android平台支持Speex推送、Speex编码质量设置;

[音量调节]Windows/Android平台采集端支持实时音量调节(其中,Windows平台混音模式下支持单独控制麦克风、扬声器音量);

[H.264硬编码]Windows/Android/iOS平台支持H.264特定机型硬编码;

[H.265硬编码]Android/iOS平台支持H.265特定机型硬编码;

[硬编码自适应]Android/iOS平台支持硬编码自适应,如检测到硬编码不支持,自动切换到软编(iOS如H.265硬编,先切换到H.264硬编码,如不支持再尝试H.264软编);

[软硬编码参数配置]支持gop间隔、帧率、bit-rate设置;

[软编码参数配置]支持软编码profile、软编码速度、可变码率设置;

[多实例推送]支持多实例推送(如同时推送屏幕/摄像头和外部数据);

[RTMP扩展H.265]Windows/Android/iOS推送SDK支持RTMP扩展H.265推送,Windows针对摄像头采集软编码,使用H.265可变码率,带宽大幅节省,效果直逼传统H.265编码摄像头,Android/iOS平台支持H.265硬编码;

[横竖屏推流]Android/iOS平台支持支持横屏、竖屏推流;

[多分辨率支持]支持摄像头或屏幕多种分辨率设置;

[Windows推屏]Windows平台支持屏幕裁剪、窗口采集、屏幕/摄像头数据合成等多种模式推送;

[移动端推屏]Android平台支持后台service推送屏幕(推送屏幕需要5.0+版本);

[移动端推屏]iOS平台支持后台推送屏幕(基于ReplayKit,需要iOS 10.0+版本);

[事件回调]支持各种状态实时回调;

[水印]Windows平台支持文字水印、png水印、实时遮挡,Android平台支持文字水印、png水印;

[RTMP推送模式]支持RTMP推送 live|record模式设置(需服务器支持);

[镜像]Android/iOS平台支持前置摄像头实时镜像功能;

[前后摄像头实时切换]Android/iOS平台支持采集过程中,前后摄像头切换;

[复杂网络处理]支持断网重连等各种网络环境自动适配;

[动态码率]支持根据网络情况自动调整推流码率;

[实时静音]支持推送过程中,实时静音/取消静音;

[实时快照]支持推流过程中,实时快照;

[纯音频推流]支持仅采集音频流并发起推流功能;

[纯视频推流]支持特殊场景下的纯视频推流功能;

[降噪]Windows/Android平台支持环境音、手机干扰等引起的噪音降噪处理、自动增益、VAD检测;

[回音消除]Android平台支持实时传递远端PCM数据,方便回音消除处理;

[外部编码前视频数据对接]支持YUV数据对接;

[外部编码前音频数据对接]支持PCM对接;

[外部编码后视频数据对接]支持外部H.264数据对接;

[外部编码后音频数据对接]外部AAC/PCMA/PCMU/SPEEX数据对接;

[推送端休眠设置]Windows平台支持休眠接口(设置成休眠模式后CPU会适当降低);

[编码后数据输出]Android平台支持输出编码后的H264/AAC数据到上层,方便对接第三方平台(如GB28181)对接;

[扩展录像功能]完美支持和录像SDK组合使用,录像相关功能,可参见”Windows/Android/iOS录像SDK“;

[裁剪模式]Android/iOS平台支持特定分辨率摄像头裁剪模式设置;

[服务器兼容]支持自建服务器(如Nginx、SRS)或CDN。