GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现

简介: GB/T28181-2022和GB/T28181-2016规范,有这么一条“更改了附录 D 基于 TCP 协议的视音频媒体传输要求(见附录 D,2016 年版的附录 L)。”。

规范解读

GB/T28181-2022和GB/T28181-2016规范,有这么一条“更改了附录 D 基于 TCP 协议的视音频媒体传输要求(见附录 D,2016 年版的附录 L)。”。


本文主要是针对GB/T28181-2022里面提到的“基于 TCP 协议的视音频媒体传输要求”做相应的接口适配,在此之前,我们先回顾下规范里面针对这部分的说明:


附录D(规范性) 基于TCP协议的视音频媒体传输


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


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


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


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

代码实现

本文以大牛直播SDK实现的Andorid平台GB28181设备接入模块为例,收到Invite处理如下,其中SetRTPSenderTransportProtocol()设置TCP/UDP传输模式,然后针对上述规范说明,添加以下接口:

  /**
     * SmartPublisherJniV2.java
     * Author: daniusdk.com
     */
    /**
   * 设置国标TCP连接超时时间
   *
   * @param timeout_ms, 单位是毫秒, 必须大于0, 不设置的话SDK将用默认值
   * @return {0} if successful
   */
  public native int SetGBTCPConnectTimeout(long handle, int timeout_ms);
  /**
   * GB/T 28181-2022 附录D: TCP流媒体传输时, 首次TCP连接失败时, 应间隔一段时间进行重连, 重连间隔应不小于1秒, 此接口设置首次重连间隔时间
   *
   * @param interval_ms, 单位是毫秒, 必须大于等于0, SDK默认值是1000毫秒(1秒)
   * @return {0} if successful
   */
  public native int SetGBInitialTCPReconnectInterval(long handle, int interval_ms);
  /**
   * GB/T 28181-2022 附录D: TCP流媒体传输时, 首次TCP连接失败时, 应间隔一段时间进行重连,重连次数应不小于3次, 此接口设置首次最大重连次数
   *
   * @param attempts, 最大重连次数, 必须大于等于0, SDK默认值是0, 如果对接的是GB/T 28181-2022 server,建议设置为3或更大的值
   * @return {0} if successful
   */
  public native int SetGBInitialTCPMaxReconnectAttempts(long handle, int attempts);

这里以Andorid平台Camera2的采集demo为例:

1ecff723aa1442319ab974d4392c337b.jpg

ntsOnAckPlay()处理代码如下:

    @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_);
                //libPublisher.SetGBTCPConnectTimeout(publisherHandle, 10*60*1000);
                //libPublisher.SetGBInitialTCPReconnectInterval(publisherHandle, 1000);
                //libPublisher.SetGBInitialTCPMaxReconnectAttempts(publisherHandle, 3);
                int startRet = libPublisher.StartGB28181MediaStream(publisherHandle);
                if (startRet != 0) {
                    if (!isRTSPPublisherRunning && !isPushingRtmp  && !isRecording) {
                        if (publisherHandle != 0) {
                            long handle = publisherHandle;
                            publisherHandle = 0;
                            libPublisher.SmartPublisherClose(handle);
                        }
                    }
                    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媒体传输重连机制,在GB/T28181-2022规范说明中明确后,虽然实现技术难度不大,但是非常必要,感兴趣的开发者可以酌情参考。

相关文章
|
编解码 监控 数据格式
【开源视频联动物联网平台】GB/T28181和SIP的区别
【开源视频联动物联网平台】GB/T28181和SIP的区别
655 1
|
存储 开发者
国标GB28181协议客户端开发(二)程序架构和注册
国标GB28181协议客户端开发(二)程序架构和注册
1178 0
|
域名解析 网络协议
网络协议与攻击模拟-02-wireshark使用-显示过滤器
网络协议与攻击模拟-02-wireshark使用-显示过滤器
366 0
|
SQL Java Apache
skywalking 搭建(apache-skywalking-apm-es7-7.0.0)
skywalking 搭建(apache-skywalking-apm-es7-7.0.0)
838 0
|
JSON NoSQL Redis
redis-full-check校验工具
redis-full-check是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具,通常用于redis数据迁移后正确性的校验。
25555 0
|
人工智能 自然语言处理 安全
DALL·E 介绍
【10月更文挑战第9天】
1555 2
|
负载均衡 前端开发 网络协议
微服务架构实施原理详解
基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发
微服务架构实施原理详解
|
编解码 网络协议 网络性能优化
RTP/RTCP 协议讲解
RTP/RTCP 协议讲解
2354 0