GB/T28181流媒体相关协议详解

news/2024/11/24 11:30:20/

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协议介绍 的文章中已经介绍了设备注册流程,设备注册流程图如下:
1

  1. 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。
  1. 认证失败响应消息实例如下:
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。
  1. 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认证信息。

  1. 注册成功响应消息实例如下:
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,主要用于设备端向国标平台定时汇报设备状态,进而实现服务器与设备之间的心跳检测机制,一般当国标平台在两个心跳周期未接收到心跳,则认为设备出下线,所以为了保证设备与国标平台之间的正常通信,设备端需要定时向国标平台发送保活协议,协议流程如下:
1

  1. 保活消息实例如下:
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
  1. 保活消息响应实例如下:
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 视频播放

前文已经介绍了视频播放的协议流程,如下图所示:
1

  1. 视频播放请求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携带的媒体信息,表示国标服务器支持的流媒体。

  1. 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,获取相关文章。

  1. 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服务端已经准备好了,可以发送媒体流了。

  1. RTP/RTCP媒体流传输

通过视频会话可知,接下来IPC应该主动向国标服务器发送RTP流,RTP协议带的媒体流封装格式为PS,传输层协议为UDP,RTP源端地址为15060,目的端地址为50000,SSRC=0200000002,抓包协议实例如下:
1
从RTP解析上看,与视频会话交互的信息一致。

总结

GB/T28181协议经过多个版本的迭代,应用在音视频传输中,已经非常完善了,最新的协议版本已经支持TCP模式进行信令交互和音视频传输,还支持主被动模式,在跨网上也有很好的适应性。


关注,发送:28181,获取更多28181文章。


http://www.ppmy.cn/news/1182046.html

相关文章

2023-10-28 LeetCode每日一题(从数量最多的堆取走礼物)

2023-10-28每日一题 一、题目编号 2558. 从数量最多的堆取走礼物二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 gifts &#xff0c;表示各堆礼物的数量。每一秒&#xff0c;你需要执行以下操作&#xff1a; 选择礼物数量最多的那一堆。如果不止一堆都符…

ExoPlayer架构详解与源码分析(7)——SampleQueue

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

数据链路层和DNS之间的那些事~

数据链路层&#xff0c;考虑的是两个节点之间的传输。这里面的典型协议也很多&#xff0c;最知名的就是“以太网”。我们本篇主要介绍的就是以太网协议。这个协议规定了数据链路层&#xff0c;也规定了物理层的内容。 目录 以太网帧格式 帧头 载荷 帧尾 DNS 从输入URL到…

数据结构OJ题

目录 1.字符串左旋 2.字符串旋转结果 3.旋转数组 4.移除元素 本篇主要是讲解一些OJ题目。 1.字符串左旋 字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法1【暴力求解】 翻转1…

PS 安装教程 2022版(全网最详细图文教程)

目录 一.简介 二.安装步骤 软件&#xff1a;PS版本&#xff1a;2022语言&#xff1a;简体中文大小&#xff1a;2.83G安装环境&#xff1a;Win10&#xff08;1903&#xff09;及以上版本&#xff0c;64位操作系统硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff0c;不支…

Python学习笔记--类的定义和调用

二、类的定义和调用 1、怎么理解类&#xff1f; 类是什么&#xff1f; 个人认为理解类&#xff0c;最简单的方式就是&#xff1a;类是一个变量和函数的集合。 可以看下下面的这张图。 这张图很好的诠释了类&#xff0c;就是把变量和函数包装在一起。 当然我们包装也不是毫…

Windows找不到文件xxxxx.exe。请确认文件名是否正确后,再试一次

问题现象&#xff1a; Win11系统&#xff0c;每次重启后报如下错误&#xff0c;Windows找不到文件xxxxx.exe。请确认文件名是否正确后&#xff0c;再试一次 w10升级w11后出现 问题原因&#xff1a; xxx文件丢失&#xff0c;不知道是归属于谁的&#xff0c;怀疑是升级给弄丢…

express session JWT JSON Web Token

了解 Session 认证的局限性 Session 认证机制需要配合 cookie 才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端接口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域 Session 认证。 注意&#xff1a; 当前端…