GB/T28181流媒体相关协议详解
文章目录
- GB/T28181流媒体相关协议详解
- 1 GB/T28181协议中使用的应用层协议介绍
- 2 实时视频点播协议交互流程
- 2.1 设备注册
- 2.2 设备保活
- 2.3 视频播放
- 总结
本文主要主要针对28181协议中视频流的部分,来阐述视频流通过28181协议如何进行视频会话和视频传输的。本文主要介绍28181协议中引用的协议、视频封装格式、实时视频点播协议交互流程等内容。
1 GB/T28181协议中使用的应用层协议介绍
28181协议规范中涉及到SIP、SDP、RTP、RTCP、RTSP等应用层协议,其中SIP+XML主要用于消息交互,SIP+SDP主要用户视频会话,RTP/RTCP主要用于媒体流传输控制,RTSP主要用户录像回放。有关各种协议的详细介绍可参考如下文章,本文不做详细介绍:
- SIP协议:参照文章 sip协议介绍
- SDP协议:参照文章 h264和h265视频流SDP描述详解
- RTCP/RTCP:参照文章 RTP/RTCP协议详解
- RTSP:参照文章 RTSP协议详解
为方便以后查看,关注公众号:壹零仓,发送消息获取相关文章,比如:发送RTP,可获取RTP协议的介绍。
2 实时视频点播协议交互流程
本章节主要针对实时视频点播协议进行详细介绍,28181发起视频会话前,首先视频终端设备需要注册到国标平台,国标平台需要查询到设备的摄像头ID,根据摄像头ID发起视频会话,进行音视频传输。
本章节抓取的协议的实验环境如下:
- 视频终端设备:海康威视的IPC
- 国标平台:EasyGBS
有关国标平台EasyGBS的使用介绍,后面会单独出一篇文章进行介绍。
28181传输层支持TCP和UDP,视频申请支持主动模式和被动模式,本文主要以常用的UDP被动模式为例,说明交互流程,后续文章会详细介绍视频主被动模式以及基于TCP的传输。
2.1 设备注册
GB/T 28181协议介绍 的文章中已经介绍了设备注册流程,设备注册流程图如下:
- REGISTER不携带鉴权信息消息实例如下:
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 10.45.12.141:5060;rport;branch=z9hG4bK873415819
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>
Call-ID: 924327262
CSeq: 1 REGISTER
Contact: <sip:34020000001110000002@10.45.12.141:5060>
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
协议详解:
- 第1行:SIP消息的方法是REGISTER,34020000002000000001是国标服务器的国标ID,也就是EasyGBS端国标ID,具体国标ID的编码方法可以参考GB/T 28181—2022中的附录D。3402000000指的是国标服务器的域国标ID,SIP/2.0指的是SIP协议版本。
- 第2行:为Via头,Via头中包含了发送请求方的相关信息,SIP/2.0/UDP表示使用的是2.0版本的SIP协议,使用的传输协议是UDP,也可以使用TCP协议;10.45.12.141:5060为请求发送方的IP、port;Via头包含branch参数,不能重复,branch是一个事务ID(Transaction ID),用于区分同一个UA所发起的不同Transaction,遵循IETF RFC3261规范的实现;rport字段表示使用rport机制路由响应,详情见IETF RFC35818,一般为了nat穿越,内网IPC向公网国标平台注册时,需要带有此字段,此时国标服务器会把从请求的UDP包中获取发送方外网对应的IP和端口,在响应中返回给发送方。
- 第3行:From头,From头中包含了请求发送方的逻辑标识,在GB28181协议中是发送请求的设备国标ID和域名。tag参数是为了身份认证的,值为随机数。
- 第4行:To头,To头在SIP协议中是为了标明请求接收方的逻辑标识的,在GB28181协议中填写的是发送请求的设备国标ID和域名。
- 第5行:Call-ID头,Call-ID头是全局唯一的,在同一个session中保持一致,在不同session中不同。
- 第6行:CSeq头,CSeq头用于标识命令顺序,序号部分为无符号整数,最大值为2^31。序号起始值是随机的,后续在同一个session中依次递增。ACK和CANCLE中的CSeq需与INVITE中的Cseq保持一致。
- 第7行:Contact头,Contact头包含源的URI信息,用来给响应消息直接和源建立连接用。在GB28181协议中为SIP设备编码@源IP地址:端口。
- 第8行:Max-Forwards头,Max-Forwards头用于设置包最大中转次数,默认是70。
- 第9行:User-Agent头,User-Agent头用于设置关于UA的信息,用户可以自定义。
- 第10:Expires头,Expires头表示超时时间。
- 第11行:Content-Length头,Content-Length头表示消息体长度,无消息体赋值0。
- 认证失败响应消息实例如下:
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.45.12.141:5060;rport=5060;received=10.45.12.141;branch=z9hG4bK873415819
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>;tag=53631846
CSeq: 1 REGISTER
Call-ID: 924327262
User-Agent: EasyGBS v200511
Content-Length: 0
Contact: <sip:34020000002000000001@10.45.12.83:5061>
WWW-Authenticate: Digest realm="3402000000",nonce="29eb6d344c29a70a0997d173e937e693"
协议详解如下:
- 第1行:SIP/2.0 401 Unauthorized,表示认证失败。
- 第2行:Via头,因为请求带有rport,所以响应中带有rport和received,表示国标服务器通过udp包解析出来的发送端的PORT和IP分别赋值给rport和received。
- 第3行与第四行:与请求类似
- 第5行:CSeq头,与请求类似,表示服务端命令序列
- 第6行:Call-ID头,与请求一致
- 第7行:User-Agent头,与请求类似,表示服务端UA信息
- 第8行:Content-Length头,与请求类似,表示消息体长度
- 第9行:Contact头,与请求一致
- 第10行:WWW-Authenticate头,WWW-Authenticate头用于配置服务端支持的认证方式及认证参数,这里认证方式为digest。
- REGISTER带有鉴权信息消息实例如下:
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 10.45.12.141:5060;rport;branch=z9hG4bK864745657
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>
Call-ID: 924327262
CSeq: 2 REGISTER
Contact: <sip:34020000001110000002@10.45.12.141:5060>
Authorization: Digest username="34020000001110000002", realm="3402000000", nonce="29eb6d344c29a70a0997d173e937e693", uri="sip:34020000002000000001@3402000000", response="42b636f290984b1d796907c882e4d5a8", algorithm=MD5
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
这里相比第一次发送的REGISTER消息,多了Authorization字段,其字段内容为digest认证信息。
- 注册成功响应消息实例如下:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.45.12.141:5060;rport=5060;received=10.45.12.141;branch=z9hG4bK864745657
From: <sip:34020000001110000002@3402000000>;tag=292191181
To: <sip:34020000001110000002@3402000000>;tag=424631862
CSeq: 2 REGISTER
Call-ID: 924327262
User-Agent: Easy SIP Server
Content-Length: 0
Date: 2022-11-07T17:22:22.710
Expires: 3600
Contact: <sip:34020000002000000001@10.45.12.83:5061>
头字段解析同上文,这里不做过多描述。
2.2 设备保活
28181协议中规定了保活的消息类型:Keepalive,主要用于设备端向国标平台定时汇报设备状态,进而实现服务器与设备之间的心跳检测机制,一般当国标平台在两个心跳周期未接收到心跳,则认为设备出下线,所以为了保证设备与国标平台之间的正常通信,设备端需要定时向国标平台发送保活协议,协议流程如下:
- 保活消息实例如下:
MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 10.45.12.141:5060;rport;branch=z9hG4bK999920179
From: <sip:34020000001110000002@3402000000>;tag=1336295153
To: <sip:34020000002000000001@3402000000>
Call-ID: 1577903431
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 164<?xml version="1.0" encoding="GB2312"?>
<Notify>
<CmdType>Keepalive</CmdType>
<SN>1822</SN>
<DeviceID>34020000001110000002</DeviceID>
<Status>OK</Status>
</Notify>
sip方法采用MESSAGE,sip头前文已经详细介绍了,这里针对消息体进行详解。
MESSAGE消息头中Content-type头为Content-type: Application/MANSCDP+xml,表示保活信息报送命令采用MANSCDP(监控报警联网系统控制描述协议,Monitoringand Alarming Network System Control Description Protocol)协议格式定义,消息体详细解释见GB/T28181-2022 A.2.5通知命令-状态信息报送部分,GB/T28181-2022可通过关注公众号:壹零仓,发送:协议规范,来获取。
- xml中Notify元素表示此消息是通知命令
- xml中CmdType表示命令类型,这里为Keepalive
- xml中的SN表示序列号
- xml中的DeviceID表示设备ID
- xml中的Status表示设备状态,这里为OK
- 保活消息响应实例如下:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.45.12.141:5060;rport=5060;received=10.45.12.141;branch=z9hG4bK999920179
From: <sip:34020000001110000002@3402000000>;tag=1336295153
To: <sip:34020000002000000001@3402000000>;tag=698636847
CSeq: 20 MESSAGE
Call-ID: 1577903431
User-Agent: Easy SIP Server
Content-Length: 0
2.3 视频播放
前文已经介绍了视频播放的协议流程,如下图所示:
- 视频播放请求INVITE实例如下:
INVITE sip:34020000001320000002@10.45.12.141:5060;transport=udp SIP/2.0
Via: SIP/2.0/UDP 10.45.12.83:5061;rport=5061;branch=z9hG4bK735682946
From: <sip:34020000002000000001@3402000000>;tag=671682946
To: <sip:34020000001320000002@10.45.12.141:5060>
Call-ID: 787682407
CSeq: 3 INVITE
Max-Forwards: 70
User-Agent: Easy SIP Server
Content-Length: 218
Content-Type: application/sdp
Contact: <sip:34020000002000000001@10.45.12.83:5061>
Subject: 34020000001320000002:0200000002,34020000002000000001:0v=0
o=34020000002000000001 0 0 IN IP4 10.45.12.83
s=Play
c=IN IP4 10.45.12.83
t=0 0
m=video 50000 RTP/AVP 96 98 97
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:98 H264/90000
a=rtpmap:97 MPEG4/90000
y=0200000002
SIP方法为INVITE,消息体为SDP,这里对请求的SDP进行详细介绍:
- V表示协议版本,默认直接赋值0
- O表示会话所有者标识(originator and session identifier),
o=<用户名> <session id> <会话版本> <网络类型><地址类型> <地址>
,国标协议中,用户名为国标ID,这里为服务器ID,session id为0,会话版本为0,网络类型为IN,地址类型为IPv4,地址为服务器IP地址。 - S表示会话名称,
s=<session name> <session description>
,会话名称默认为Play,会话描述默认为空。 - C表示数据连接描述,
c=<networktype> <address type> <connection address>
,
网络类型为IN,地址类型为IPv4,地址为服务器IP地址。 - t表示会话活动时间,
t=<start time> <stop time>
,实时视频时都赋值为0。 - m表示媒体描述,描述媒体类型、接收媒体流端口、传输层协议、负载类型等,媒体类型采用video表示传输视频或音视频混合,采用audio表示纯音频;传输方式采用RTP/AVP表示采用RTP over UDP,采用TCP/RTP/AVP表示传输层协议采用RTP over TCP,本实例中表示申请的媒体类型为音视频/视频,接收媒体流的端口为50000,传输层协议为RTP over UDP,负载类型为96、98、97
- a表示媒体扩展属性,a=recvonly表示只接受媒体流,a=rtpmap表示rtp映射信息描述,这里a=rtpmap:96 PS/90000表示传输的PS流的payload为96,采样率为90000,a=rtpmap:98 H264/90000表示传输的H264流的payload为98,采样率为90000,a=rtpmap:97 MPEG4/90000表示传输的MPEG4流的payload为97,采样率为90000。
- y表示SSRC值,为十进制整数字符串,格式为:dddddddddd,第一位为0表示实时流,为1表示历史流,第2-6位为国标ID的4-8位,第7-10位作为流媒体同步信源表示。
28181中规定了SDP各字段的含义,具体可参照GB/T28181-2022 附录F。服务端发送INVITE携带的媒体信息,表示国标服务器支持的流媒体。
- INVITE响应消息实例:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.45.12.83:5061;rport=5061;branch=z9hG4bK735682946
From: <sip:34020000002000000001@3402000000>;tag=671682946
To: <sip:34020000001320000002@10.45.12.141:5060>;tag=140553725
Call-ID: 787682407
CSeq: 3 INVITE
Contact: <sip:34020000001110000002@10.45.12.141:5060>
Content-Type: application/sdp
User-Agent: IP Camera
Content-Length: 199v=0
o=34020000001110000002 261 261 IN IP4 10.45.12.141
s=Play
c=IN IP4 10.45.12.141
t=0 0
m=video 15060 RTP/AVP 96
a=setup:active
a=sendonly
a=rtpmap:96 PS/90000
a=filesize:0
y=0200000002
响应中的SDP描述的流媒体信息表示IPC支持的流媒体格式及传输方式,IPC响应的SDP中,包含了a=setup:active,这个字段只在TCP传输中起作用,UDP可以忽略,对于TCP传输,包含此字段表示IPC主动连接国标服务器,如果为a=setup:passive表示IPC端为被动模式,由国标服务器发起TCP连接。
通过SDP可以看出,IPC发送的是PS封装的实时流,payload为96,采用UDP的传输模式,发送流的源端端口为15060。国标协议支持最广泛的流媒体封装协议为PS,有关PS的详细介绍可关注公众号:壹零仓,发送:ps,获取相关文章。
- ACK消息实例:
ACK sip:34020000001320000002@10.45.12.141:5060;transport=udp SIP/2.0
Via: SIP/2.0/UDP 10.45.12.83:5061;rport=5061;branch=z9hG4bK672682961
From: <sip:34020000002000000001@3402000000>;tag=671682946
To: <sip:34020000001320000002@10.45.12.141:5060>;tag=140553725
Call-ID: 787682407
CSeq: 3 ACK
Max-Forwards: 70
User-Agent: Easy SIP Server
Content-Length: 0
SIP的ACK方法,通知IPC服务端已经准备好了,可以发送媒体流了。
- RTP/RTCP媒体流传输
通过视频会话可知,接下来IPC应该主动向国标服务器发送RTP流,RTP协议带的媒体流封装格式为PS,传输层协议为UDP,RTP源端地址为15060,目的端地址为50000,SSRC=0200000002,抓包协议实例如下:
从RTP解析上看,与视频会话交互的信息一致。
总结
GB/T28181协议经过多个版本的迭代,应用在音视频传输中,已经非常完善了,最新的协议版本已经支持TCP模式进行信令交互和音视频传输,还支持主被动模式,在跨网上也有很好的适应性。
关注公众号:壹零仓,发送:28181,获取更多28181文章。