前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现

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

原创
作者头像
音视频牛哥
发布2023-04-25 14:19:25
8770
发布2023-04-25 14:19:25
举报

规范解读

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传输模式,然后针对上述规范说明,添加以下接口:

代码语言:java
复制
/**
     * 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为例:

ntsOnAckPlay()处理代码如下:

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 规范解读
  • 代码实现
  • 总结
相关产品与服务
实时音视频
实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档