GB/T28181-2022相对2016版基于TCP协议的视音频媒体传输要求区别

数据安全 数据安全 1300 人阅读 | 0 人回复

发表于 2023-10-16 10:44:23 | 显示全部楼层 |阅读模式

GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现规范解读
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传输模式,然后针对上述规范说明,添加以下接口:
  1. /**
  2.      * SmartPublisherJniV2.java
  3.      * Author: daniusdk.com
  4.      */
  5.     /**
  6.          * 设置国标TCP连接超时时间
  7.          *
  8.          * @param timeout_ms, 单位是毫秒, 必须大于0, 不设置的话SDK将用默认值
  9.          * @return {0} if successful
  10.          */
  11.         public native int SetGBTCPConnectTimeout(long handle, int timeout_ms);


  12.         /**
  13.          * GB/T 28181-2022 附录D: TCP流媒体传输时, 首次TCP连接失败时, 应间隔一段时间进行重连, 重连间隔应不小于1秒, 此接口设置首次重连间隔时间
  14.          *
  15.          * @param interval_ms, 单位是毫秒, 必须大于等于0, SDK默认值是1000毫秒(1秒)
  16.          * @return {0} if successful
  17.          */
  18.         public native int SetGBInitialTCPReconnectInterval(long handle, int interval_ms);


  19.         /**
  20.          * GB/T 28181-2022 附录D: TCP流媒体传输时, 首次TCP连接失败时, 应间隔一段时间进行重连,重连次数应不小于3次, 此接口设置首次最大重连次数
  21.          *
  22.          * @param attempts, 最大重连次数, 必须大于等于0, SDK默认值是0, 如果对接的是GB/T 28181-2022 server,建议设置为3或更大的值
  23.          * @return {0} if successful
  24.          */
  25.         public native int SetGBInitialTCPMaxReconnectAttempts(long handle, int attempts);
复制代码
这里以Andorid平台Camera2的采集demo为例:

ntsOnAckPlay()处理代码如下:
  1.     @Override
  2.     public void ntsOnAckPlay(String deviceId) {
  3.         handler_.postDelayed(new Runnable() {
  4.             @Override
  5.             public void run() {
  6.                 Log.i(TAG,"ntsOnACKPlay, device_id:" +device_id_);

  7.                 if (!isRTSPPublisherRunning && !isPushingRtmp && !isRecording) {
  8.                     InitAndSetConfig();
  9.                 }

  10.                 libPublisher.SetGB28181RTPSender(publisherHandle, gb28181_rtp_sender_handle_, gb28181_rtp_payload_type_, gb28181_rtp_encoding_name_);

  11.                 //libPublisher.SetGBTCPConnectTimeout(publisherHandle, 10*60*1000);
  12.                 //libPublisher.SetGBInitialTCPReconnectInterval(publisherHandle, 1000);
  13.                 //libPublisher.SetGBInitialTCPMaxReconnectAttempts(publisherHandle, 3);

  14.                 int startRet = libPublisher.StartGB28181MediaStream(publisherHandle);
  15.                 if (startRet != 0) {

  16.                     if (!isRTSPPublisherRunning && !isPushingRtmp  && !isRecording) {
  17.                         if (publisherHandle != 0) {
  18.                             long handle = publisherHandle;
  19.                             publisherHandle = 0;
  20.                             libPublisher.SmartPublisherClose(handle);
  21.                         }
  22.                     }

  23.                     destoryRTPSender();

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

  27.                 if (!isRTSPPublisherRunning && !isPushingRtmp && !isRecording) {
  28.                     CheckInitAudioRecorder();
  29.                 }

  30.                 startLayerPostThread();
  31.                 isGB28181StreamRunning = true;
  32.             }

  33.             private String device_id_;

  34.             public Runnable set(String device_id) {
  35.                 this.device_id_ = device_id;
  36.                 return this;
  37.             }

  38.         }.set(deviceId),0);
  39.     }
复制代码
总结

TCP媒体传输重连机制,在GB/T28181-2022规范说明中明确后,虽然实现技术难度不大,但是非常必要,感兴趣的开发者可以酌情参考。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则