国标28181: 视频国标28181协议

article/2025/9/19 16:23:09

国标的由来

GB28181国标解决平台与平台对接问题
在这里插入图片描述

比如A平台大连交警系统需要看B平台上海交警系统的视频。需要对接过来,实现调度视频。这时候需要知道他们取流的协议,各家厂商都自定义了一套协议,就很麻烦,因此国家就制定了GB28181国标实现A和B平台的相互取流,是一个应用层协议。由国内各大厂商,研究院制定的标准。

通信流程图

基于SIP信令流程图

如下图
在这里插入图片描述
信令交互成功后,摄像机(媒体流发送者)推送流到媒体服务器,媒体服务器在指定的端口接收到视频流后,转发给流媒体接受者(比如某台PC的某个空闲端口)
在这里插入图片描述

  • SPI服务器和媒体服务器可以是同一个设备
  • 媒体流接受者:摄像头推送给媒体服务器,媒体服务器在退给其他媒体设备接收者,媒体服务器相当于分发,中转(也可以直接推给媒体流接受者)然后提供RTSP、RTMP、FLV、HLS多种格式进行分发,实现Web浏览器、手机浏览器、微信、PC客户端等各终端无插件播放

平台的上级、下级(平级一般不使用)

A平台想从B平台取流,A平台就是上级,B平台就是下级。视频流从下级推到上级。

推模式与拉模式

拉模式

前端是一个IP Camera -> (RTSP) - media server。server这里发生请求,这样IPC会推给你,没有请求IPC停止推送。

推模式

media server A; media server B

  • A从B要取流,会告诉B我要从哪个port来取流,B知道了,根据A想要视频流的IP,port,将视频流推给对应的端口。
  • A给B发个bye,我不要了,就结束了消息的传送。
  • A没有发B的BYE,比如A就已经关了,突然断了,那么B就会一直发视频流,除非你把B平台停止了。
  • SIP信令只注册一回。

监控领域涉及到的业务

  • 取设备信息(大连平台需要知道上海平台挂的1千 2万个设备(如ID))。
  • 取实时流(A从B平台取正在直播的视频流取过来)。
  • 录像回放(A从B平台NVR以前录过的视频流)。
  • 设备控制:云台控制,语音对讲。(怎么取音频,视频格式国标里都是有详细的介绍)。

GB28181的优缺点

优点

  • 协议统一方便平台间通信
  • 因为GB28181是推的模式,可以实现视频流出外网,比如海康的(萤石云)

缺点

国标相对简陋(只定义了一些基本的通信字段),有很多异常通信并没有处理掉。

举例如下:录像回放业务:

  • A从B平台取昨天录像回放,而B平台昨天的录像回放没有了。
    这样的话A平台就得主动去问B,你会给我什么,这样的去协商,因为国标里没有定义,B是资源的提供方,B有可能就不想给你。A派个研发过去取流,而B平台是一个维护人员只能给你一个port,他给不了你其他的信息。这就导致了平台对接中的各种麻烦,不知道就的去猜。
  • A平台给B平台发条请求,获取录像的信息比如一天或者一个小时。这其中你 查多久,这个允许的范围国标里是没有的,查询多长时间返回也没有规定。
  • 平台对接:B是综合平台,经过多级流媒体服务才能拿到录像时间段视频流。消息推送比较慢,A需要几秒才能收到返回

目前来说:大厂家做的比较早,小厂家都是去适应大厂家

移植

  • 控制协议:基于国际的SIP协议和XML协议,相关开源库:libosip, libeXosip, mxml, md5
  • 流媒体:采用PS流的RTP封装,简易流程:H264 -> PS -> RTP -> SIP服务器

http://chatgpt.dhexx.cn/article/XNDpDGDp.shtml

相关文章

【C/C++】isalpha、islower、isupper、isalnum、isblank、isspace函数cctype / ctype.h头文件

isalpha、islower、isupper、isalnum、isblank、isspace这些函数都在<cctype>&#xff08;即C语言中的<ctype.h>&#xff09;的头文件里面&#xff0c;下图是它们所表示的范围&#xff1a; 总的来说就是&#xff1a; isalpha &#xff08;字母&#xff0c;包括大写…

细微之处见真章之StringUtils的isBlank函数细节解读

一、背景 技术群里有一个老铁分享了一段 commons-lang 的 StringUtils 工具类的代码&#xff1a; public static boolean isBlank(final CharSequence cs) {int strLen;if (cs null || (strLen cs.length()) 0) {return true;}for (int i 0; i < strLen; i) {if (Char…

字符串判空,isBlank 和 isEmpty 到底选那个?

字符串的判空&#xff0c;日常开发是经常要做的一种校验&#xff0c;common-lang包帮我们做了一些字符串判空的封装 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId> </dependency> 并对外提…

sbrk() 函数是干什么的?

brk和sbrk主要的工作是实现虚拟内存到内存的映射. 在GNU C中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G&#xff0c;但在程序编译时&#xff0c;不可能也没必要为程序分配这么大的空间&#xff0c;只分配并不大的数据段空间&#xff0c;程序中动态分配的空间就是从这…

ORACLE如何修改默认端口号

oracle在安装的的时候&#xff0c;除了可以默认端口号&#xff0c;也可以填入自定义的端口号。但是项目上会出现这样的情况&#xff0c;项目在进展时期&#xff0c;需要对数据库安全升级&#xff0c;首先要修改数据库的默认端口号。那如何来设置oracle的默认端口号&#xff0c;…

Oracle如何更改端口号

Oracle默认端口号为8080&#xff0c;因为Tomcat端口默认也是8080所以需要把Oracle端口更改一下&#xff0c;不建议更改Tomcat端口号 运行cmd命令行操作 查看Oracle版本&#xff1a; 链接Oracle数据库&#xff1a; conn system/root as sysdba&#xff0c;system/root用户名和…

Oracle 19c中默认端口

Oracle官网https://docs.oracle.com/en/database/oracle/oracle-database/19/rilin/port-numbers-and-protocols-of-oracle-components.html#GUID-D168F70C-BECE-4F9A-B616-D9103A35F1FFhttps://www.cndba.cn/hbhe0316/article/87226https://www.cndba.cn/hbhe0316/article/872…

oracle 数据库改端口

Oracle 11g修改默认端口1521为其他值 1、修改listener.ora 打开文件D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora&#xff0c;修改PORT 后的数值&#xff0c;如下图 修改listener.ora文件 2、重启TNSListener服务 在Windows服务中重启OracleOr…

如何查看oracle的服务端口号

查看 oracle服务端口的步骤&#xff1a; 按住WinR键&#xff0c;弹出DOS命令窗口。 输入cmd命令&#xff0c;点击确定。 弹出的DOS窗口中&#xff0c;i输入 lsnrctl status 命令&#xff0c;并点击Enter键。 找到窗口中&#xff0c;以下文字‘监听端点概要 (DESCRIPTION…

JUC是什么?

JUC表示什么 JUC是java.util.concurrent包的缩写&#xff0c;其包结构如下。 JUC框架结构 JUC是包的简称&#xff0c;JUC可能也是Java核心里最难的一块儿&#xff0c;JUC指的是Java的并发工具包&#xff0c;里边提供了各种各样的控制同步和线程通信的工具类。学习JUC之前&a…

JUC总结系列篇 (二) : 对线程的理解和使用总结

文章内容&#xff1a; 一.为什么需要多线程 二.线程的创建 三.线程的方法sleep(),run(),wait(),yeid(),join(),interrupt()等方法归纳总结 四.线程的状态及其转换 五.线程的交替执行案例 六.多个线程依次执行案例 七.多线程并发带来的线程安全问题 一.为什么需要多线程&#x…

JUC源码系列-ReentrantReadWriteLock

继承关系 ReadLock和WriteLock是ReentrantReadWriteLock的两个内部类&#xff0c;Lock的上锁和释放锁都是通过AQS来实现的。 AQS定义了独占模式的acquire()和release()方法&#xff0c;共享模式的acquireShared()和releaseShared()方法。 还定义了抽象方法tryAcquire()、tryA…

了解JUC

高级技术之 JUC 高并发编程 内容概览 1 、什么是JUC2 、Lock接口3 、线程间通信4 、集合的线程安全5 、多线程锁6 、Callable接口7 、JUC三大辅助类: CountDownLatch CyclicBarrier Semaphore8 、读写锁: ReentrantReadWriteLock9 、阻塞队列10 、ThreadPool线程池11 、Fork/…

juc系列(1)---进程,线程,并行,并发

目录 概述进程线程关系并发并行&#xff1a;同步异步&#xff1a;对比 概述 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU,数据加载至内 存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加…

JUC系列(九) CAS 与锁的理解

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️你好啊&#xff01;小伙伴&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;擅…

JUC系列(四)

1、CAS 1.1、没有CAS之前&#xff0c;保证线程安全的方式 多线程环境不使用原子类保证线程安全&#xff08;基本数据类型&#xff09; public class T3 {volatile int number 0;//读取public int getNumber(){return number;}//写入加锁保证原子性public synchronized void…

1、什么是juc

1、juc简介 在java中&#xff0c;线程部分是重点&#xff0c;juc就是java.util.concurrent工具包的简称。这是一个处理线程的工具包&#xff0c;从jdk1.5开始出现 2、进程与线程 进程&#xff1a;指在系统中正在运行的一个应用程序&#xff1b;程序一旦运行就是进程&#xff1…

JUC系列(六) 线程池

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️你好啊&#xff01;小伙伴&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;擅…

JUC系列(五)

1、ThreadLocal 1.1、什么是ThreadLocal 线程局部变量。 1.2、ThreadLocal的作用以及可以为什么保证线程安全&#xff1f; 多线程访问同一个共享变量的时候容易出现并发问题&#xff0c;特别是多个线程对一个变量进行写入的时候&#xff0c;为了保证线程安全&#xff0c;一…

JUC系列(二)

1、聊一聊Java“锁” 1.1、乐观锁和悲观锁 悲观锁&#xff1a;认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会先加锁&#xff0c;确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁。适合写操作多的场景&#…