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
  • 运动估计与运动补偿

    运动估计与运动补 偿 改正 2010 11 17 10 29 29 运动补偿是通过先前的局部图像来预测 补偿当前的局部图像 它是减少帧序列冗余信息的有效方法 运动估计是从视频序列中抽取运动信息的一整套技术 运动估计与运动补偿技术 MPEG
  • Android平台如何高效率实现GB28181对接?

    技术背景 GB28181协议是一种用于设备状态信息报送的协议 可以在不同设备之间进行通信和数据传输 在安卓系统上实现GB T 28181非常必要 GB28181协议实现分两部分 一部分是信令 另外一部分就是媒体数据的编码 信令主要包括SIP
  • Android平台GB28181设备接入端如何实现本地录像?

    实现Android平台GB28181设备接入的时候 有个功能点不可避免 那就是本地录像 实际上 在实现GB28181设备接入模块之前 我们前些年做RTMP推送和轻量级RTSP服务的时候 早已经实现了本地录像功能 本地录像功能 我们实现的主要
  • librtmp ssl 1.0.0 到 ssl 1.1.1

    openssl 版本更新了 导致 librtmp 库不能使用 于是查查资料 Compiler errors dereferencing pointer to incomplete type DH aka struct dh st 根据上面的
  • 如何快速实现Android平台前端设备接入能力

    技术背景 SIP 会话初始化协议 是在 IP网络上进行多媒体通信的应用层控制协议 以几种RFC的形式提供 其中最重要的是包含核心协议规范的RFC3261 该协议用于创建 修改和终止与一个或多个参与者的会话 通过会话 我们了解了一组进行通信的
  • GB/T28181设备接入端如何应用到数字城管场景?

    什么是数字城管 数字城管 又称 数字化城市管理 或 智慧城管 是一种采用信息化手段和移动通信技术来处理 分析和管理整个城市的所有城管部件和城管事件信息 促进城市管理现代化的信息化措施 数字城管通过建立城市管理信息化平台 实现城市管理信息的采
  • Andorid平台GB28181设备接入端如何生成黑帧并推送至国标平台

    我们在做Android平台GB28181设备接入模块的时候 遇到这样的需求 做移动对讲的时候 是不需要视频数据的 但是国标平台侧 没有视频的话 大多平台又无法播纯音频打包的数据 网页端大多基于http flv或webrtc实现 基于此 我们
  • ffmpeg命令行map参数的使用

    介绍 理解 map参数的最好办法就是想像一下怎么去告诉ffmpeg你要从源文件中选择 拷贝哪个流到输出文件 输出文件的stream顺序取决于在命令行中 map的参数顺序 下面有一些例子 默认 默认操作 没有指定map参数 比如 ffmpeg
  • RTP时间戳概念

    RTP协议不依赖于底层协议 由于UDP包的快速 时实性高的特点 它通常和UDP结合在一起 作为UDP的上层载体数据的形式传播 typedef struct rtp header t uint32 t v 2 protocol version
  • GB/T28181-2016传输要求和Android平台设备接入技术实现

    相关协议规范 GB T28181 2016公共安全视频监控联网系统 信息传输 交换 控制技术要求相关的传输要求如下 5 1 网络传输协议要求 联网系统网络层应支持IP协议 传输层应支持 TCP和 UDP协议 5 2 媒体传输协议要求 视音频
  • Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

    一对一音视频通话使用场景 一对一音视频通话都需要稳定 清晰和流畅 以确保良好的用户体验 常用的使用场景如下 社交应用 社交应用是一种常见的使用场景 用户可以通过音视频通话进行面对面的交流 在线教育 老师和学生可以通过音视频通话功能进行实时互
  • Android平台GB28181设备接入模块相关博客概览

    Android平台GB28181设备接入模块 可实现不具备国标音视频能力的 Android终端 通过平台注册接入到现有的GB T28181 2016服务 可用于如智能监控 智慧零售 智慧教育 远程办公 生产运输 智慧交通 车载或执法记录仪等
  • Android前端音视频数据接入GB28181平台意义

    技术背景 在我们研发Android平台GB28181前端音视频接入模块之前 业内听到最多的是 如何用Android或者Windows端 在没有国标IPC设备的前提下 模拟GB28181的信令和媒体流交互流程 实现GB28181整体方案的测试
  • 元宇宙时代超高清视音频技术白皮书关于流媒体协议和媒体传输解读

    流媒体协议 元宇宙业务场景对流媒体传输的实时性和互动性提出了更高的要求 这就需要在传统的 RTMP SRT HLS 等基础上增加实时互动的支持 实时互动 指在远程条件下沟通 协作 可随时随地接入 实时地传递虚实融合的多维信息 身临其境的交互
  • 格式工厂5.10.0版本安装

    目前格式工厂有很多 大多都可以进行视频转换 之前遇到一个用ffmpeg拉流保存的MP4在vlc和迅雷都无法正常播放的问题 发现视频长度不对 声音也不对 最后换到了格式工厂的格式播放器是可以正常播放的 格式工厂下载之家的地址 https ww
  • GB/T 28181联网系统通信协议结构和技术实现

    技术回顾 在本文开头 我们先一起回顾下GB T28181联网系统通信协议结构 联网系统在进行视音频传输及控制时应建立两个传输通道 会话通道和媒体流通道 会话通道用于在设备之间建立会话并传输系统控制命令 媒体流通道用于传输视音频数据 经过压缩
  • RTP/RTCP/RTSP负载H264的一些问题小结

    以下内容都是基于rfc3984 RTP负载H264时的参数配置 1 在TCP传输时 Transport头中的interleaved参数必须设置 比如0 1 或者2 3 海康的流中出现了4 但是没有配置 所以wireshark也无法解析cha
  • Android平台RTMP

    我们需要怎样的直播播放器 很多开发者在跟我聊天的时候 经常问我 为什么一个RTMP或RTSP播放器 你们需要设计那么多的接口 真的有必要吗 带着这样的疑惑 我们今天聊聊Android平台RTMP RTSP播放器常规功能 如软硬解码设置 实时
  • 海康、大华IpCamera RTSP地址和格式

    大家注意 我下面文章描述的都是海康老款摄像机的RTSP规则 现在新的DS 系列 摄像机型号为DS 开头的 的摄像机RTSP规则为 http blog csdn net xiejiashu article details 71786187 海

随机推荐

  • 组合预测模型

    组合预测模型 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媒体传输应