GB28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“调整

2023-10-26

规范解读

GB28181-2022针对“基于TCP协议的视音频媒体传输”实时点播、历史视频回放与下载中,TCP媒体传输重连机制,做了说明。

修改后的“基于TCP协议的视音频媒体传输要求”如下:

实时视频点播、历史视频回放与下载的TCP媒体传输应支持基于RTP封装的视音频PS流,封装格式参照IETF RFC 4571。

流媒体服务器宜同时支持作为TCP媒体流传输服务端和客户端。在默认情况下,前端设备向流媒体服务器发送媒体流时,前端设备应作为TCP媒体流传输客户端,流媒体服务器作为TCP媒体流传输服务端;同级或跨级流媒体服务器间基于TCP协议传输视频流时,媒体流的接收方宜作为TCP媒体流传输服务端。

媒体流的发送方和接收方可扩展SDP参数进行TCP媒体流传输服务端和客户端的协商,协商机制应符合附录G及IETF RFC 4571的定义。

实时视频点播、历史视频回放与下载的TCP媒体传输在建立TCP连接时应支持重连机制。首次TCP连接失败,TCP媒体流传输客户端应间隔一段时间进行重连,重连间隔应不小于l s,重连次数应不小于3次。

代码实现

本文以大牛直播SDK实现的Andorid平台GB28181设备接入模块为例,收到Invite处理如下,其中SetRTPSenderTransportProtocol()设置TCP/UDP传输模式:

ntsOnInvitePlay()处理代码如下:

// Author: daniusdk.com
@Override
public void ntsOnInvitePlay(String deviceId, SessionDescription session_des) {
    handler_.postDelayed(new Runnable() {
        @Override
        public void run() {
            // 先振铃响应下
            gb28181_agent_.respondPlayInvite(180, device_id_);

            MediaSessionDescription video_des = null;
            SDPRtpMapAttribute ps_rtpmap_attr = null;

            // 28181 视频使用PS打包
            Vector<MediaSessionDescription> video_des_list = session_des_.getVideoPSDescriptions();
            if (video_des_list != null && !video_des_list.isEmpty()) {
                for(MediaSessionDescription m : video_des_list) {
                    if (m != null && m.isValidAddressType() && m.isHasAddress() ) {
                        video_des = m;
                        ps_rtpmap_attr = video_des.getPSRtpMapAttribute();
                        break;
                    }
                }
            }

            if (null == video_des) {
                gb28181_agent_.respondPlayInvite(488, device_id_);
                Log.i(TAG, "ntsOnInvitePlay get video description is null, response 488, device_id:" + device_id_);
                return;
            }

            if (null == ps_rtpmap_attr) {
                gb28181_agent_.respondPlayInvite(488, device_id_);
                Log.i(TAG, "ntsOnInvitePlay get ps rtp map attribute is null, response 488, device_id:" + device_id_);
                return;
            }

            Log.i(TAG,"ntsOnInvitePlay, device_id:" +device_id_+", is_tcp:" + video_des.isRTPOverTCP()
                    + " rtp_port:" + video_des.getPort() + " ssrc:" + video_des.getSSRC()
                    + " address_type:" + video_des.getAddressType() + " address:" + video_des.getAddress());

            long rtp_sender_handle = libPublisher.CreateRTPSender(0);
            if ( rtp_sender_handle == 0 ) {
                gb28181_agent_.respondPlayInvite(488, device_id_);
                Log.i(TAG, "ntsOnInvitePlay CreateRTPSender failed, response 488, device_id:" + device_id_);
                return;
            }

            gb28181_rtp_payload_type_  = ps_rtpmap_attr.getPayloadType();
            gb28181_rtp_encoding_name_ =  ps_rtpmap_attr.getEncodingName();

            libPublisher.SetRTPSenderTransportProtocol(rtp_sender_handle, video_des.isRTPOverUDP()?0:1);
            libPublisher.SetRTPSenderIPAddressType(rtp_sender_handle, video_des.isIPv4()?0:1);
            libPublisher.SetRTPSenderLocalPort(rtp_sender_handle, 0);
            libPublisher.SetRTPSenderSSRC(rtp_sender_handle, video_des.getSSRC());
            libPublisher.SetRTPSenderSocketSendBuffer(rtp_sender_handle, 2*1024*1024); // 设置到2M
            libPublisher.SetRTPSenderClockRate(rtp_sender_handle, ps_rtpmap_attr.getClockRate());
            libPublisher.SetRTPSenderDestination(rtp_sender_handle, video_des.getAddress(), video_des.getPort());

            if ( libPublisher.InitRTPSender(rtp_sender_handle) != 0 ) {
                gb28181_agent_.respondPlayInvite(488, device_id_);
                libPublisher.DestoryRTPSender(rtp_sender_handle);
                return;
            }

            int local_port = libPublisher.GetRTPSenderLocalPort(rtp_sender_handle);
            if (local_port == 0) {
                gb28181_agent_.respondPlayInvite(488, device_id_);
                libPublisher.DestoryRTPSender(rtp_sender_handle);
                return;
            }

            Log.i(TAG,"get local_port:" + local_port);

            String local_ip_addr = IPAddrUtils.getIpAddress(context_);

            MediaSessionDescription local_video_des = new MediaSessionDescription(video_des.getType());

            local_video_des.addFormat(String.valueOf(ps_rtpmap_attr.getPayloadType()));
            local_video_des.addRtpMapAttribute(ps_rtpmap_attr);

            local_video_des.setAddressType(video_des.getAddressType());
            local_video_des.setAddress(local_ip_addr);
            local_video_des.setPort(local_port);

            local_video_des.setTransportProtocol(video_des.getTransportProtocol());
            local_video_des.setSSRC(video_des.getSSRC());

            if (!gb28181_agent_.respondPlayInviteOK(device_id_,local_video_des) ) {
                libPublisher.DestoryRTPSender(rtp_sender_handle);
                Log.e(TAG, "ntsOnInvitePlay call respondPlayInviteOK failed.");
                return;
            }

            gb28181_rtp_sender_handle_ = rtp_sender_handle;
        }

        private String device_id_;
        private SessionDescription session_des_;

        public Runnable set(String device_id, SessionDescription session_des) {
            this.device_id_ = device_id;
            this.session_des_ = session_des;
            return this;
        }
    }.set(deviceId, session_des),0);
}

收到Ack后:

// Author: daniusdk.com
@Override
public void ntsOnAckPlay(String deviceId) {
    handler_.postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG,"ntsOnACKPlay, device_id:" +device_id_);

            if (!isRTSPPublisherRunning && !isPushingRtmp && !isRecording) {
                InitAndSetConfig();
            }

            libPublisher.SetGB28181RTPSender(publisherHandle, gb28181_rtp_sender_handle_, gb28181_rtp_payload_type_, gb28181_rtp_encoding_name_);
            int startRet = libPublisher.StartGB28181MediaStream(publisherHandle);
            if (startRet != 0) {

                if (!isRTSPPublisherRunning && !isPushingRtmp  && !isRecording) {
                    if (publisherHandle != 0) {
                        libPublisher.SmartPublisherClose(publisherHandle);
                        publisherHandle = 0;
                    }
                }

                destoryRTPSender();

                Log.e(TAG, "Failed to start GB28181 service..");
                return;
            }

            if (!isRTSPPublisherRunning && !isPushingRtmp && !isRecording) {
                CheckInitAudioRecorder();
            }

            startLayerPostThread();
            isGB28181StreamRunning = true;
        }

        private String device_id_;

        public Runnable set(String device_id) {
            this.device_id_ = device_id;
            return this;
        }

    }.set(deviceId),0);
}

总结

TCP媒体传输重连机制,非常必要,实际上在2022出来之前,我们也已经做了很好的重连处理,GB28181-2022对此专门做了详细的解释说明,具体实现难度不大,感兴趣的开发者可以酌情参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GB28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“调整 的相关文章

  • 网络流媒体(七)———RTSP

    RTSP协议介绍 RTSP协议的一些分析 一 一些字符串函数的使用 RTSP协议的一些分析 二 printf类似函数 sscanf以及log保存到内存中 printf输入重定位 1 简介 DSP产生的媒体流需要通过网络传送到客户端 如图1
  • H264 NALU 使用PS封装 RTP发送

    最近由于项目平台需求 要将H264 NALU封装为PS再用RTP发送 PS封装按照ISO DEC 13818 1标准 一个PS包包含PS Header PES Header PS system header PS system map等 针
  • GB28181智慧可视化指挥控制系统之执法记录仪设计探讨

    什么是智慧可视化指挥控制系统 智慧可视化指挥控制平台通过4G 5G网络 WIFI实时传输视音频数据至指挥中心 特别是在有突发情况时 可以指定一台执法仪为现场视频监控器 实时传输当前画面到指挥中心 指挥中心工作人员可通过麦克风向现场执法人员下
  • Linux平台如何实现采集音视频数据并注入轻量级RTSP服务?

    技术背景 好多开发者 问我们最多的问题是 为什么要设计轻量级RTSP服务 轻量级RTSP服务 和RTSP服务有什么区别 针对这个问题 我们的回答是 轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP服务或者RTMP服务 R
  • 国家开源软件资源库

    http yp oss org cn software show cat php cat id 5 基本信息 成熟度 Dimdim 2009 05 19 1 2 3 4 5 6 7
  • Android平台GB28181设备接入模块分辨率发生变化怎么办?

    技术背景 我们在做Android平台gb28181设备接入模块的时候 遇到这样的情况 比如横竖屏分辨率不锁定 采集摄像头的时候 可以实现 横屏状态采集横屏 竖屏状态采集竖屏 简单来说 横屏状态比如采集的1280 720的 竖屏状态 采集的数
  • GB/T28181设备接入端如何应用到数字城管场景?

    什么是数字城管 数字城管 又称 数字化城市管理 或 智慧城管 是一种采用信息化手段和移动通信技术来处理 分析和管理整个城市的所有城管部件和城管事件信息 促进城市管理现代化的信息化措施 数字城管通过建立城市管理信息化平台 实现城市管理信息的采
  • 【无标题】ZLM和wvp配置

    ZLM配置 wvp对zlm要求的配置只有一个 具体值随便设置 以9080为例 http port 9080 wvp配置 确保media gt ip为zlm的IP media gt port为刚才配置的9080 其他wvp配置参考配置说明按需
  • GB28181媒体保活机制探究与实现

    规范解读 GB28181 2016和GB28181 2022关于媒体保活机制这块 并无调整 平台 设备媒体流保活机制规定如下 a 链路建立后 码流经过的各级平台应具备媒体流丢失监测能力 若监测到媒体流丢失 应释放该条媒体链路 并通过会话内B
  • [轻量级RTSP服务]Linux

    背景 随着国产操作系统的推进 传统行业对Linux平台的呼声和需求越来越大 之前几年 我们发布了Linux平台运营商级的RTSP转RTMP推送模块 RTMP推送模块和RTSP RTMP播放模块 前段时间 有开发者问我们 是不是可以在Linu
  • Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

    技术背景 我们在Android平台实现GB28181设备接入 把摄像头和麦克风数据 采集过去 用于移动单兵 智能车载 智慧安防 智能家居 工业仿真等行业时 发现大多场景对视频水印的要求越来越高 从之前的固定位置静态文字水印 png水印等慢慢
  • 使用nginx做为http-flv服务如何解决跨域问题

    什么是跨域 跨域是指浏览器的同源策略限制 这个策略会阻止一个域的javascript脚本和另外一个域的内容进行交互 如果一个请求url的协议 域名 端口三者之间任意一个与当前页面的url不同即为跨域 如下图所示即为跨域时的报错 使用ngin
  • FFmpeg进阶: 音频变声滤镜

    声音最重要的两个元素就是语速和语调 改变声音的辨识度主要也是从这两方面入手 我们可以通过对音频数据进行插值或者抽值修改 以达到降低语速和增加语速的目的 同时我们也可以通过对数据进行线性拉伸来调节音调 语速调整 语调调整 就可以让我们的声音千
  • RTP时间戳概念

    RTP协议不依赖于底层协议 由于UDP包的快速 时实性高的特点 它通常和UDP结合在一起 作为UDP的上层载体数据的形式传播 typedef struct rtp header t uint32 t v 2 protocol version
  • GB/T28181-2022图像抓拍规范解读及技术实现

    规范解读 GB28181 2022相对2016 增加了设备软件升级 图像抓拍信令流程和协议接口 我们先回顾下规范说明 图像抓拍基本要求 源设备向目标设备发送图像抓拍配置命令 携带传输路径 会话ID等信息 目标设备完成图像传输后 发送图像抓拍
  • 基于SRS的视频直播服务器搭建

    srs提供的一个demo实例 包括实时流的rtmp播放 hls播放 视频会议 ffmpeg视频变换 jwplayer播放 OSMF播放 vlc播放等等功能 下面是在Centos 6 x环境下的编译搭建流程 1 下载或更新源码或者使用git更
  • GB28181设备接入侧如何支持H.265?

    技术背景 一直以来 GB28181 2022之前的规范版本让人诟病的一点 没有明确针对H 265的说明 特别是监控摄像机 H 265已然成为标配 GB T28181 2022规范 终于针对H 265做了明确的说明 让我们来一起解读下规范 基
  • 最新VLC命令行参数大全(一)

    用法 vlc 选项 流 您可以在命令行中指定多个流 它们将被加入播放列表队列 指定的首个项目将被首先播放 选项风格 选项 用于设置程序执行期间的全局选项 选项 单字母版本的全局 选项 选项 仅对此选项之前的单条流生效 且优先级高于先前的设置
  • Android平台GB28181设备接入侧(编码前

    在之前 我有写过Android平台GB28181设备接入模块的好多blog 包括参数设置 功能支持与扩展等 以数据接入为例 支持的数据类型涉及编码前 编码后或直接流数据 RTSP或RTMP流 可用于如智能监控 智慧零售 智慧教育 远程办公
  • GB28181设备接入端如何播放语音广播数据?

    技术背景 语音广播功能是GB28181设备接入端非常重要的功能属性 语音广播让终端和平台之间 有了实时双向互动 可以满足执法记录仪 智能安全帽 智能监控 智慧零售 智慧教育 远程办公 明厨亮灶 智慧交通 智慧工地 雪亮工程 平安乡村 生产运

随机推荐

  • 组合预测模型

    组合预测模型 LSTM XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测 Matlab程序 目录 组合预测模型 LSTM XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测 Matlab程序 预测结果 评价指标 基
  • [History]W. Richard Stevens

    读过 Advanced Programming in the UNIX Enviroment 读过 TCP IP Illustrated 读过 UNIX Network Programming 直到今天才直到她们的作值是同一个人 W Ric
  • pycharm使用小技巧-插入代码/默认模板

    每次用pycharm写代码的时候前面几行代码都要重复写 作为一名新生代民工 对于这种重复性工作当然是能省略就省略的了 未设置前 我们新建一python文件都是空白的 如下图 而设置好之后的样子如下 新建之后便是我们想要的模板 设置步骤如下
  • MyBatis中${} 和 #{} 有什么区别?

    和 都是 MyBatis 中用来替换参数的 它们都可以将用户传递过来的参数 替换到 MyBatis 最终生成的 SQL 中 但它们区别却是很大的 接下来我们一起来看 1 功能不同 是将参数直接替换到 SQL 中 比如以下代码 最终生成的执行
  • 鲍鱼数据集数据分析和可视化,线性回归预测鲍鱼年龄(基于TensorFlow)

    一 数据集描述 Name Data Type Meas Description Sex nominal M F and I infant Length continuous mm Longest shell measurement Diam
  • 详解·高通Vuforia识别追踪3D物体/模型,Unity开发

    研究这个问题的初衷 1 公司要做一个识别3D物体的案例 参考了各个平台 发现EasyAR和Vuforia支持3D物体识别与追踪 2 刚开始用EasyAR做 但做了一半发现有一定的限制 1 必须Pro版本的EA插件才能支持3D物体识别与追踪
  • 简单电子产品的蓝牙电路设计和PCB设计

    最近做的项目中的电子产品都有用到蓝牙模块 所以简单来讲一讲 在原理图设计时 需要在天线与模块射频输出管脚预留一个 型网络 天线的阻抗受PCB的铺地 天线的安装以及周围的金属等因素影响 预留这个网络是为了在天线严重偏离50欧姆阻抗时 将其匹配
  • (AcWing)高精度乘法

    给定两个非负整数 不含前导 00 AA 和 BB 请你计算 A BA B 的值 输入格式 共两行 第一行包含整数 AA 第二行包含整数 BB 输出格式 共一行 包含 A BA B 的值 数据范围 1 A的长度 1000001 A的长度 10
  • [计算机网络] HTTP协议

    计算机网络 HTTP协议 文章目录 计算机网络 HTTP协议 一 工作方式 二 HTTP报文详解 1 请求报文 1 1 报文结构 1 2 组成1 请求行 1 3 组成2 请求头 1 4 组成3 请求体 1 5 总结 2 响应报文 2 1 状
  • Fiddler抓包工具(手机使用)

    一 参数配置 1 启动Fiddler 打开菜单栏中的Tools gt Options 打开 Options 对话框 2 在 Options 对话框切换到 HTTPS 选项卡 然后勾选 Decrypt HTTPS traffic 后面的复选框
  • EndNote使用手册(无图版)

    含图笔记在有道云笔记中 https note youdao com s E1MiEzk8 文章目录 1 软件安装 2 EndNote软件界面 2 1 设置Library 2 2 导入文献 3 文献管理 3 1 文献分组 3 2 查看文献原文
  • conda install nb_conda出错

    问题 conda install nb conda 一直solving environment 或者显示http400 换成pip install notebook 依旧不行 换成其他源 亲测此时中科大源有效 清华 https pypi t
  • 程序员接私活的6个网站,你有技术就有钱!

    点击上方 Python高校 关注 未未干货立马到手 作者 发哥 链接 GitHubDaily 本篇文章会向大家推荐国内外几个接外包比较靠谱的平台 主旨是贵精不贵多 因此 像 猪x戒 这种会让程序员自贬身价 扰乱市场规则的网站 便不会出现在下
  • 标准的产品设计工作流程

    每个产品团队都会有自己的工作流程 无论这个工作流程是否最高效 是否体现最大价值 但是我认为只要这个流程能够为实现工作目标提供过程的保障就可以算是好的流程 对于流程本身而言 可以因团队不同或工作任务不同而有差异 一个成熟度的产品团队可以在保证
  • 阿里云服务器无法外网访问的坑

    最近各大平台在促销云服务器 于是买了阿里云的window 10服务器 于是坑来了 简单安装nginx后 以为像其他服务器一样 公网IP访问就 了 没想到搞了好久 最后发现如下帖子 https www cnblogs com kekelele
  • 学习笔记-Midjourney的关键词详解

    大家好啊 我是了不起 前一段时间ChatGPT突然火爆 大佬们纷纷下场 我也跟着努力学习 做了一些笔记 下面将陆续放出笔记 共享给小伙伴们 这是放出的第七篇 和小伙伴们与时俱进哈 Midjourney 关键词详解 为了方便小伙伴们能够更好的
  • 每天一个Python基础编程题——九九乘法表

    请用for循环打印出九九乘法表 上三角 for low in range 1 10 for row in range 1 low 1 print lt 2 format row low low row end print
  • (Mac)如何下载、安装并注册VMware Fusion虚拟机软件(Mac专用)

    写在前面 前一阵子写了一篇关于 如何下载 安装并注册VMware Workstation Pro虚拟机软件 的文章 但是有一部分用户用的是Mac 发现没有VMware Workstation Pro的Mac版本 还不愿意用价格更昂贵的pd
  • String面试题

    如何判断一个字符串中某个字符出现的次数 听到该问题 我脑海中第一反应是先把字符串转换为字符数组 然后使用foreach循环 在循环体内进行字符比对 代码如下所示 public static void main String args Str
  • GB28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“调整

    规范解读 GB28181 2022针对 基于TCP协议的视音频媒体传输 实时点播 历史视频回放与下载中 TCP媒体传输重连机制 做了说明 修改后的 基于TCP协议的视音频媒体传输要求 如下 实时视频点播 历史视频回放与下载的TCP媒体传输应