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。