すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo Live:GRTN への標準 WebRTC アクセスのためのシグナリングプロトコル仕様

最終更新日:Aug 21, 2026

RTS (RTS) は、Web Real-Time Communication (WebRTC) のシグナリングインタラクションに基づいています。RTS は、Alibaba Cloud のライブストリーミングノードのグローバルなカバー率と高度なスケジューリングアルゴリズムを活用します。このトピックでは、GRTN への標準 WebRTC アクセスのためのシグナリングプロトコルについて説明し、WebRTC の基本的な知識を持つ開発者を対象としています。

背景情報

ApsaraVideo Live は、TCP を使用した場合に 3〜6 秒以上になることがある遅延の問題に対処するために、付加価値機能としてRTS を提供します。RTS は UDP プロトコルを使用し、統合が容易で、ミリ秒レベルの遅延、高い同時実行性、高解像度のライブストリーミング体験を提供します。RTS は、オープンで標準的なエコシステムを構築するように設計されています。Alibaba Cloud の専用 RTS SDK に加えて、RTS は WebRTC ライクなシグナリングを使用してライブストリーミングノードから音声およびビデオストリームをアップストリームおよびフェッチするカスタムクライアントをサポートしています。これにより、お客様は Alibaba Cloud の RTS サービスを、大規模かつ便利に、セルフマネージドで利用できます。

GRTN は現在、劣悪なネットワーク条件に対する耐障害性を提供しています。

前提条件

シグナリングインタラクションフロー

次の図は、シグナリングインタラクションフローを示しています。

001

シグナリングインタラクションフロー

  1. クライアントが offer リクエストを送信します。
    1. クライアントはローカルの RTCPeerConnection を作成し、音声とビデオを受信するためのストリーム方向プロパティを設定し、offer SDP を作成します。
      // 音声とビデオを有効化、recvonly または sendonly
      { offerToReceiveVideo: true, offerToReceiveAudio: true }
    2. クライアントは、HTTPS POST リクエストを介して、JSON 形式のストリームフェッチングリクエストを ApsaraVideo Live サービスに送信します。プロトコル形式の詳細については、「シグナリングプロトコルの定義」をご参照ください。
      • version フィールドはプロトコルバージョンを指定します。現在のバージョンは 2 に固定されています。
      • sdk_version フィールドは SDK バージョンを指定します。このフィールドはカスタマイズできます。
    3. プロトコルコンテンツが生成された後、クライアントはそれを POST リクエストで ApsaraVideo Live サービスのシグナリングエンドポイントに送信し、シグナリングインタラクションを完了します。リクエストの JSON 本文には、フェッチするストリーム URL が含まれます。
      POST /app/streamname?auth=xxx HTTP/1.1
      Host: domain
      Connection: keep-alive
      Content-Length: 2205
      Content-Type: application/json
      説明 シグナリングエンドポイントはストリーム URL とほぼ同じですが、プロトコルプレフィックスが異なります:
      • シグナリングエンドポイント:https://domain/app/streamname?auth=xxx
      • ストリーム URL:artc://domain/app/streamname?auth=xxx
  2. サーバーが SDP answer で応答します。

    ApsaraVideo Live サーバーはリクエストのセキュリティを検証し、SDP answer を生成し、レスポンスボディでノード情報をクライアントに返します。プロトコル形式の詳細については、「シグナリングプロトコルの定義」をご参照ください。

  3. クライアントが ICE 接続を確立します。
    1. クライアントが SDP answer を受信した後、RTCPeerConnection に answer を設定します。
      peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep));
    2. RTCPeerConnection は ICE 接続の確立プロセスと、その後の DTLS プロセスを開始します。メディアチャネルが確立されると、クライアントは ApsaraVideo Live サービスからメディアストリームを受信できます。これにより、ストリームフェッチングと再生のための標準 WebRTC アクセスが完了します。
  4. 切断。

    切断してアップストリーミングまたは再生を停止するには、クライアントは DTLS Alert メッセージを送信します。

    断开连接
H5 デモの例
// ピア接続とローカル offer sdp を作成します。
peerConnection = new RTCPeerConnection();
peerConnection.onicecandidate = iceCandidateCallback;
peerConnection.ontrack = remoteStreamCallback;
peerConnection.createOffer({ offerToReceiveVideo: true, offerToReceiveAudio: true })
      .then(signaling_pull).catch(errorHandler);


// ApsaraVideo Live にストリームフェッチングリクエストを送信します。
function signaling_pull(offer_sdp) {
  console.log('local offer sdp', offer_sdp);

  peerConnection.setLocalDescription(offer_sdp).then(function() {
    // ストリームフェッチング URL を取得します。
    var stream_url = $("#stream_url").val();
    console.log("stream url:" , stream_url);

    // sdk とプロトコルのバージョンを追加します。
    var protocol_version = 2;
    var sdk_version = "0.0.1";

    $.ajax({url: stream_url, data: JSON.stringify({
          mode: "live",
          version: protocol_version,
          sdk_version: sdk_version,
          jsep:description,
      }),
      type: "post",
      success:function(result){
          var signal = JSON.parse(result);
          peerConnection.setRemoteDescription(new RTCSessionDescription(signal.jsep)).then(function() {
              console.log("get remote answer sdp: ", signal.jsep.sdp);
          }).catch(errorHandler);
      }});
  }).catch(errorHandler);
}
                

シグナリングプロトコルの定義

RTS シグナリングプロトコルは、HTTPS (短時間接続) と JSON 形式を使用します。以下にサンプルを示します:

{
    "version":2,
    "sdk_version":"0.0.1",
    "mode":"live",
    "pull_streams":[
        {
            "url":"artc://your.domain.com/live/testname",
            "amsid":[
                "rts audio"
            ],
            "vmsid":[
                "rts video"
            ]
        }
    ],
    "jsep":{
        "type":"offer",
        "sdp":"v=0\n\ro=- 6839248142876176651 2 IN IP4 127.0.0.1\n\rs=-\n\r... 省略 ..."
    }
}

再生

  • 再生プロトコルの説明
    表 1. リクエストパラメーター
    パラメータータイプ必須説明
    modestringはいモード。値を live に設定します。
    versionintはいプロトコルのバージョン番号。値を 2 に設定します。
    push_streamstringいいえアップストリーミング URL
    pull_streams[]objectいいえストリームフェッチングオブジェクト。複数のストリームをフェッチできます。詳細については、次の表をご参照ください。
    sdk_versionstringいいえSDK のバージョン番号。
    jsep.typestringはいSDP タイプ。値を offer に設定します。
    jsep.sdpstringはいSDP 記述。
    表 2. pull_stream パラメーター
    フィールドタイプ必須説明
    urlstringはいストリームフェッチング URL。例:artc://<pull_stream_url>
    amsid[]stringはいストリームフェッチング用の音声 msid。ライブストリーミングシナリオでは、値を rts audio に設定します。
    vmsid[]stringはいストリームフェッチング用のビデオ msid。ライブストリーミングシナリオでは、値を rts video に設定します。
    表 3. レスポンスパラメーター
    フィールドタイプ必須説明
    codeintはいリターンコード。値が 200 の場合は成功を示します。エラーコードの詳細については、以下のエラーコード説明表をご参照ください。
    trace_idstringはいCDN によって生成されたグローバルに一意なリクエスト ID。リクエストの特定とトラブルシューティングに役立てるため、この ID を保存してください。
    jsep.typestringはいSDP タイプ。値を answer に設定します。
    jsep.sdpstringはいAlibaba Cloud CDN がオリジンフェッチのために生成した SDP。
  • 再生リクエストの例
    リクエスト:
    {
        "version":2,
        "sdk_version":"0.0.1",
        "mode":"live",
        "pull_streams":[
            {
                "url":"artc://your.domain.com/live/testname",
                "amsid":[
                    "rts audio"
                ],
                "vmsid":[
                    "rts video"
                ]
            }
        ],
        "jsep":{
            "type":"offer",
            "sdp":"v=0\n\ro=- 6839248142876176651 2 IN IP4 127.0.0.1\n\rs=-\n\r... 省略 ..."
        }
    }
    
    レスポンス:
    {
        "trace_id":"2_1591173296_101.227.0.169_702080732320_dec327eb6eed0e0b07b349c8a5653eca",
        "code":200,
        "jsep":{
            "type":"answer",
            "sdp":"v=0\r\no=- 1591173291 2 IN IP4 127.0.0.1\n\r ... 省略 ..."
        }
    }

    sps-pps-idr-in-keyframe:劣悪なネットワークでの再生中に映像のアーティファクトが発生するのを防ぐには、SDP を変更します。

    H5 サブスクリプションストリーム (recvonly) の offer が生成された後、setLocalDescription を呼び出す前に、SDP を変更します。H.264 ビデオプロパティで、次のような行を見つけます:
    a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
    その行に sps-pps-idr-in-keyframe=1 を追加します:
    a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f;sps-pps-idr-in-keyframe=1

    GRTN はこの変更に応答し、ブラウザでこの機能を有効にします。

  • エラー処理

    シグナリングリクエストが有効な場合、サーバーは 200 レスポンスを返します。具体的な結果を取得するには、JSON レスポンスボディの code プロパティを解析します。code プロパティは HTTP レスポンスコードパターンに従います。以下にサンプルを示します:

    レスポンス:
    {
       "code": 200, // 200: 成功。200 以外のコードについては、以下の定義をご参照ください。
       "message": "success"  // 200 以外のエラーコードの説明。
    }
    表 4. レスポンスパラメーター
    パラメータータイプ説明
    codeintレスポンスコード。フォーマットと定義の詳細については、次の表をご参照ください。
    messagestringエラーの説明。
    表 5. エラーコードの説明
    エラーコード説明
    403認証に失敗しました。
    404ストリームが存在しません。
    611クライアントは再生のために TCP にフォールバックする必要があります。
    302クライアントは新しいサービスエンドポイントに新しいシグナリングリクエストを送信する必要があります。

ストリームインジェスト

  • アップストリーミングプロトコルの説明
    表 6. リクエストパラメーター
    パラメータータイプ必須説明
    modestringはいモード。値を live に設定します。
    versionintはいプロトコルのバージョン番号。値を 2 に設定します。
    push_streamstringいいえアップストリーミング URL
    sdk_versionstringいいえSDK のバージョン番号。
    jsep.typestringはいSDP タイプ。値を offer に設定します。
    jsep.sdpstringはいSDP 記述。
    表 7. レスポンスパラメーター
    フィールドタイプ必須説明
    codeintはいリターンコード。値が 200 の場合は成功を示します。エラーコードの詳細については、以下のエラーコード説明表をご参照ください。
    trace_idstringはいCDN によって生成されたグローバルに一意なリクエスト ID。リクエストの特定とトラブルシューティングに役立てるため、この ID を保存してください。
    jsep.typestringはいSDP タイプ。値を answer に設定します。
    jsep.sdpstringはいAlibaba Cloud CDN がオリジンフェッチのために生成した SDP。
  • アップストリーミングリクエストの例
    リクエスト:
    {
        "version":2,
        "sdk_version":"0.0.1",
        "mode":"rtc",
        "push_stream":"artc://host/app/name",
        "jsep":{
            "type":"offer",
            "sdp":"v=0\r\no=- 1385856200224536561 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS rts\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:iQyM\r\na=ice-pwd:D3GXKCcUGvW9djaAozff5ppT\r\na=ice-options:trickle\r\na=fingerprint:sha-256 20:50:72:9B:A2:C0:D8:50:AD:D0:EF:A7:62:8F:EF:C3:AB:86:D5:B6:3E:17:22:69:79:5B:CE:E8:42:33:B5:E4\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendrecv\r\na=msid:rts audio\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=rtcp-fb:111 nack\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3411287802 cname:s4eR7OuKnnPL0vKS\r\na=ssrc:3411287802 msid:rts audio\r\na=ssrc:3411287802 mslabel:rts\r\na=ssrc:3411287802 label:audio\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127 121 125 107 108 109 124 120 123 119 35 36 41 42 114 115 116 117 118\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:iQyM\r\na=ice-pwd:D3GXKCcUGvW9djaAozff5ppT\r\na=ice-options:trickle\r\na=fingerprint:sha-256 20:50:72:9B:A2:C0:D8:50:AD:D0:EF:A7:62:8F:EF:C3:AB:86:D5:B6:3E:17:22:69:79:5B:CE:E8:42:33:B5:E4\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendrecv\r\na=msid:rts video\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=123\r\na=rtpmap:35 H264/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=fmtp:35 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:41 AV1/90000\r\na=rtcp-fb:41 goog-remb\r\na=rtcp-fb:41 transport-cc\r\na=rtcp-fb:41 ccm fir\r\na=rtcp-fb:41 nack\r\na=rtcp-fb:41 nack pli\r\na=rtpmap:42 rtx/90000\r\na=fmtp:42 apt=41\r\na=rtpmap:114 H264/90000\r\na=rtcp-fb:114 goog-remb\r\na=rtcp-fb:114 transport-cc\r\na=rtcp-fb:114 ccm fir\r\na=rtcp-fb:114 nack\r\na=rtcp-fb:114 nack pli\r\na=fmtp:114 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 red/90000\r\na=rtpmap:117 rtx/90000\r\na=fmtp:117 apt=116\r\na=rtpmap:118 ulpfec/90000\r\na=ssrc-group:FID 4075787827 945566690\r\na=ssrc:4075787827 cname:s4eR7OuKnnPL0vKS\r\na=ssrc:4075787827 msid:rts video\r\na=ssrc:4075787827 mslabel:rts\r\na=ssrc:4075787827 label:video\r\na=ssrc:945566690 cname:s4eR7OuKnnPL0vKS\r\na=ssrc:945566690 msid:rts video\r\na=ssrc:945566690 mslabel:rts\r\na=ssrc:945566690 label:video\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:iQyM\r\na=ice-pwd:D3GXKCcUGvW9djaAozff5ppT\r\na=ice-options:trickle\r\na=fingerprint:sha-256 20:50:72:9B:A2:C0:D8:50:AD:D0:EF:A7:62:8F:EF:C3:AB:86:D5:B6:3E:17:22:69:79:5B:CE:E8:42:33:B5:E4\r\na=setup:actpass\r\na=mid:2\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n"
        }
    }
    
    レスポンス:
    {
        "trace_id":"...",
        "code":200,
        "jsep":{
            "type":"answer",
            "sdp":"v=0\r\no=- 1657264764 2 IN IP4 127.0.0.1 ... 省略 ..."
        }
    }
                        
    シグナリングメッセージでは、push_stream がアップストリーミング URL を指定します。これは RTMP アップストリーミングに似ています。注意:
    • SDP で msid を指定する必要があります。GRTN は msid をメディアの一意の識別子として使用します。
    • アップストリーミングではメディアネゴシエーションはサポートされていません。クライアントによって指定された単一のメディア msid に対して、1 種類のエンコーディングのみが許可されます。GRTN は選択を行いません。GRTN は現在、AAC、Opus、H.264、H.265 をサポートしています。
    • 音声audio1audio2
    • ビデオvideo1video2
  • エラー処理

    シグナリングリクエストが有効な場合、サーバーは 200 レスポンスを返します。具体的な結果を取得するには、JSON レスポンスボディの code プロパティを解析します。code プロパティは HTTP レスポンスコードパターンに従います。以下にサンプルを示します:

    レスポンス:
    {
       "code": 200, // 200: 成功。200 以外のコードについては、以下の定義をご参照ください。
       "message": "success"  // 200 以外のエラーコードの説明。
    }
    表 8. レスポンスパラメーター
    パラメータータイプ説明
    codeintレスポンスコード。フォーマットと定義の詳細については、次の表をご参照ください。
    messagestringエラーの説明。
    表 9. エラーコードの説明
    エラーコード説明
    403認証に失敗しました。
    611クライアントは TCP にフォールバックする必要があります。
    302クライアントは新しいサービスエンドポイントに新しいシグナリングリクエストを送信する必要があります。

拡張 SDP

シグナリング中、SDP はメディア情報を記述するために使用されます。一般的な SDP ネゴシエーションは RFC 4566 に基づいています。Alibaba Cloud RTS は、これをより豊かなセマンティクスで拡張し、ライブストリーミング業界と互換性を持たせています。RTS は、より多くの音声およびビデオのカプセル化フォーマットと通信プロトコルをサポートしています。これにより、WebRTC の制限 (Opus 音声のみのサポートやビデオでの B フレームの非サポートなど) を克服し、進化し続けるストリーミングメディア業界のニーズに対応します。

アップストリーミングとストリームフェッチングにおける AAC 音声のサポート

RTS は、AAC-LC、HE-AACv1、HE-AACv2 など、RTMP で転送可能なあらゆる AAC 音声フォーマットの転送をサポートします。

RTS は、LATM フォーマットでの AAC 音声転送をサポートします。LATM は、音声ストリーム自体がこの情報を含むかどうかに応じて、音声エンコーディング情報をインバンド (すべての音声パケットと共に送信) またはアウトオブバンド (一度だけ送信) で送信できます。これは、Audio Mux Element の muxconfigPresent によって決定されます。これにより、LATM は ADTS よりも柔軟になります。AudioSpecificConfig が変更されない場合、StreamMuxConfig (AudioSpecificConfig) 情報は SDP セッションで最初に送信できます。

  • アップストリーミングでの AAC 音声のサポート

    offer SDP には、アップストリームされる音声フォーマットをサーバーに通知するための AAC 情報を含めることができます。また、FMTP 行に config=StreamMuxConfig を追加することもできます。この config は、アップストリームされるストリームの AudioSpecificConfig 情報からアセンブルされ、この情報をサーバーに送信して AAC ヘッダーを生成します。

    offer SDP:
    a=rtpmap:125 MP4A-LATM/48000/2
    a=fmtp:125 config=4000232000;cpresent=0;object=2;profile-level-id=1
  • ストリームフェッチングでの AAC 音声のサポート

    シグナリングインタラクション中、RTS はアップストリームソースから音声エンコーディング情報を解析し、ネゴシエーションレスポンスで対応する情報を返します。次の表に詳細を示します。

    offer SDPanswer SDP
    AAC-LCHE-AACv1HE-AACv2
    m=audio 9 UDP/RTP/AVPF 120 96 
    a=rtpmap:120 MP4A-LATM/44100/2  
    AudioSpecificConfig = 0x1210
    AudioSpecificConfig = 2b920800
    AudioSpecificConfig = eb8a0800
    a=rtpmap:120 MP4A-LATM/44100/2
    a=fmtp:120 cpresent=0;profile-level-id=1;object=2;config=400024203fc0
    a=rtpmap:120 MP4A-LATM/44100/2 
    a=fmtp:120 cpresent=0;profile-level-id=1;object=2;config=4000572410003fc0;SBR-enabled=1
    a=rtpmap:120 MP4A-LATM/44100/2 
    a=fmtp:120 cpresent=0;object=2;profile-level-id=1;config=4001d71410003fc0;PS-enabled=1;SBR-enabled=1

    ここで、answer SDP の MP4A-LATM 音声の fmtp 行に SBR-enabled=1 を追加すると HE-AAC を示します。SBR-enabled=1PS-enabled=1 の両方を追加すると HE-AACv2 を示します。SBR と PS の識別子は、AAC-LC から HE-AACv2 への技術的進歩を反映して、異なる AAC フォーマットを表すために段階的に追加されます。さらに、fmtp 行には config=StreamMuxConfig が追加されます。これは、アップストリームされるストリームの AudioSpecificConfig 情報からアセンブルされ、音声エンコーディングパラメーターに関する詳細情報を提供します。クライアントは、必要に応じてこの情報を使用できます。

    002

アップストリーミングとストリームフェッチングにおける H.265 ビデオのサポート

  • アップストリーミングでの H.265 ビデオのサポート

    offer SDP には、アップストリームされるビデオフォーマットをサーバーに通知するための H.265 情報を含めることができます。

    Offer SDP:
    a=rtpmap:102 H265/90000 
  • ストリームフェッチングでの H.265 ビデオのサポート

    ストリームフェッチングのシグナリングインタラクション中、サーバーはソースストリームのビデオエンコーディング情報 (H.264 や H.265 など) を取得し、この情報に基づいてネゴシエーションを行います。

    offer SDPanswer SDP
    a=rtpmap:102 H265/90000
    a=rtpmap:122 H265/90000
    a=fmtp:122

アップストリーミングとストリームフェッチングにおける B フレームを含むビデオのサポート

  • アップストリーミングでの B フレームのサポート

    アップストリーム用のソースストリームには B フレームを含めることができます。

  • ストリームフェッチングでの B フレームのサポート

    シグナリングインタラクション中、クライアントは offer SDP にフィールドを追加して、B フレームを含むビデオの解析をサポートするかどうかを示すことができます。たとえば、ビデオの fmtp 行に BFrame-enabled = 1 を追加して、B フレームのサポートを示します。この場合、RTP タイムスタンプ = PTS となり、シーケンス番号は増分します。クライアントはシーケンス番号に基づいて通常のデコードを実行できます。B フレームがサポートされていない場合、RTS はソースビデオストリームをトランスコードして B フレームを削除できます。

    B フレームが存在する場合、RTP タイムスタンプ = PTS となり、シーケンス番号は増分します。クライアントはシーケンス番号に基づいて通常のデコードを実行できます。

    サーバーは、DTS の正確な計算 (PTS = DTS + CTS) を必要とするクライアントのために、追加のコミットタイムスタンプ (CTS) 拡張ヘッダーを返すこともサポートしています。offer SDP に a=extmap:{$id} uri:webrtc:rtc:rtp-hdrext:video:CompositionTime が含まれている場合、RTS は 拡張識別子 = {$id} を持つ CTS 拡張ヘッダー を各ビデオフレームの最初の RTP パケットに追加します。id は offer SDP によって決定されます。

    RTS は、B フレームを含むビデオを受け入れるかどうか、および追加の CTS 情報が必要かどうかをクライアントが柔軟に決定できるようにします。より普遍的な通信機能を構築することは、RTS のコア原則です。

次の図は、offer SDP のスニペットと、ストリームフェッチングからキャプチャされたパケットの例を示しています:

Offer SDP片段004

アップストリーミングのシグナリングでメタデータを伝送するサポート

RTMP アップストリーミングは、RTMP メタデータを使用してメタデータを伝送し、アップストリームコールバックやストリームフェッチングクライアントに情報を提供できます。WebRTC トランスポートはネイティブでメタデータをサポートしていないため、RTS はシグナリングメッセージで追加情報を伝送して、アップストリームされるストリームにメタデータを生成することをサポートしています。

アップストリーミングシグナリングメッセージの本文にメタデータフィールドを追加します:

{
    "version":2,
    "sdk_version":"0.0.1",
    "mode":"rtc",
    "push_stream":"artc://host/app/name",
    "jsep":{
        "type":"offer",
        "sdp":"..."
    },
    "metadata":{
        "framerate":"20",
        "platform":"iOS",
        "audiodatarate":"200",
        "videodatarate":"2000"
    }
}

MSID の概念

MSID の詳細については、「The Msid Mechanism」をご参照ください。次の点にご注意ください:Msid