「TCP プロトコルに基づくビデオおよびオーディオ メディア伝送の要件」の 2016 年版に対する GB/T28181-2022 の解釈と技術的実装

規範的解釈

GB/T28181-2022 および GB/T28181-2016 仕様では、「付録 D に TCP プロトコルに基づくビデオおよびオーディオ メディア伝送の要件を変更しました (2016 年版の付録 D、付録 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 メディア ストリーミング クライアントは一定の間隔で再接続する必要があります。再接続間隔は 1 秒以上、再接続の回数は 3 回以上にする必要があります。

コード

この記事では、Daniu Live SDK によって実装された Andorid プラットフォーム GB28181 デバイス アクセス モジュールを例に取り、Invite を次のように受信して処理します。上記の仕様:

	/**
     * 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 のコレクション デモを取り上げます。

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 仕様で規定された後、この技術を実装することは難しくありませんが、非常に必要であり、関心のある開発者は適宜参照できます。

おすすめ

転載: blog.csdn.net/renhui1112/article/details/130362317