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

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

时间:2023-04-25 13:34:04浏览次数:43  
标签:媒体 传输 TCP T28181 视音频 GB 重连 publisherHandle

规范解读

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为例:

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

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规范说明中明确后,虽然实现技术难度不大,但是非常必要,感兴趣的开发者可以酌情参考。


标签:媒体,传输,TCP,T28181,视音频,GB,重连,publisherHandle
From: https://blog.51cto.com/daniusdk/6223802

相关文章

  • TCPDump抓包工具的使用
      TCPDump是一款强大的网络抓包工具,它可以帮助网络管理员或安全专家监视和分析网络数据包。本文将详细介绍TCPDump的使用方法,以及如何解读TCPDump抓包结果。工具安装    TCPDump在Linux中已经默认安装。如果没有安装可以利用yumaptopkg等命令直接进行安装。查看......
  • 使用tcpkill实用程序终止TCP连接
    Linux连接久久不能释放的现象不常见,但偶然也会发生。进程虽不复存在,但是客户端的连接咬定青山不放松,死活也不肯吐出连接,导致重启进程时因操作系统判断监听端口被占用而无法启动。常规手段已经束手无策,这时候不得不想办法杀连接。一、tcpkill介绍tcpkill是网络嗅探工具包dsniff其中......
  • nginx - 反向代理tcp地址
    在http同级添加红色部分即可#tcp配置stream{server{listen9101;proxy_pass127.0.0.1:8080;}}.........http{......}stream的端口不可与http共用,需要单独占用一个新的......
  • 第138篇:了解HTTP协议(TCP/IP协议,DNS域名解析,浏览器缓存)
    好家伙,发现自己的网络知识十分匮乏,赶紧补一下 这里先举个我生活中的例子欸,作业不会写了,上网搜一下用edge浏览器上bing必应搜一下(百度广告太多了,真不想用百度举例子) 假设这是我们第一次访问bing的首页当我向浏览器中输入https://cn.bing.com/并按下回车浏览器做了什么?(我......
  • Golang实现TCP端口扫描器
    简易版packagemainfuncworker(ports,resultschanint){forp:=rangeports{address:=fmt.Sprintf("bilibili.com:%d",p)conn,err:=net.Dial("tcp",address)iferr!=nil{result<-0conti......
  • Golang实现代理TCP客户端
    目标网站xxx.com,代理服务器xxxproxy.com,通过代理服务器实现流量转发。packagemainfunchandle(srcnet.Conn){dst,err:=net.Dial("tcp","xxx.com:80")iferr!=nil{log.Fatalln("Unabletoconnectoutunreachablehost")}deferd......
  • TCP 三次握手过程中客户端发送的 SYN 报文的基本结构
    **以下是SYN报文示意图,展示了TCP三次握手过程中客户端发送的SYN报文的基本结构**。```SegmentHeader+----------------+------------------------------+|......
  • netty之TCP粘包拆包问题解决
    TCP粘包拆包问题解决什么TCP粘包和拆包问题假设客户端向服务端连续发送了两个数据包,分别用ABC和DEF来表示,那么服务端收到的数据可以分为以下三种情况:第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象。第二种情况,接收端只收到一个数据包,这一个数据包中包含了发送端发......
  • TCP/IP笔记
    OSI模型:(OpenSystemInterconnect)包含七层:物理层,链路层,网络层,传输层,会话层,表示层,应用层TCP/IP协议简化为4层对应OSPI为:应用层:HTTP/FTP/SMTP/Telnet传输层:TCP/UDP网络层:ICMP,IP,IGMP链路层:ARP,RARP应用层: 链路层:交换机MAC-->MAC网络层:IP-->IPMAC表:交换机中MAC和交换机端口对应......
  • golang中通过原始socket实现tcp/udp的服务端和客户端示例
    这些天稍微空点,总结下golang中通过tcp/udp实现服务端客户端的编程实现,毕竟长久以来,如果要截单的http服务,我们直接使用net/http包实现服务,或者使用框架如gin/echo/beego等。以下就直接上代码,稍微看看都能懂起。1.TCP的实现serverpackagemainimport( "bufio" "fmt" "net"......