All Products
Search
Document Center

ApsaraVideo Live:Spesifikasi protokol signaling untuk akses WebRTC standar ke GRTN

Last Updated:Aug 20, 2026

RTS (RTS) didasarkan pada interaksi signaling Komunikasi Web Real-Time (WebRTC). RTS memanfaatkan cakupan global dan algoritma penjadwalan advanced dari node live streaming Alibaba Cloud. Topik ini menjelaskan protokol signaling untuk akses WebRTC standar ke GRTN dan ditujukan bagi pengembang yang memiliki pemahaman dasar mengenai WebRTC.

Informasi latar belakang

ApsaraVideo Live menyediakan fitur bernilai tambah RTS (RTS) untuk mengatasi masalah latensi, yang dapat mencapai 3 hingga 6 detik atau lebih saat menggunakan TCP. RTS menggunakan protokol UDP dan memberikan pengalaman live streaming berlatensi milidetik, konkurensi tinggi, dan definisi tinggi yang mudah diintegrasikan. RTS dirancang untuk membangun ekosistem yang terbuka dan standar. Selain SDK RTS khusus dari Alibaba Cloud, RTS juga mendukung klien kustom yang menggunakan signaling mirip WebRTC untuk melakukan pengambilan aliran (stream ingest) dan penarikan aliran (stream pulling) audio serta video dari node live streaming. Hal ini memungkinkan pelanggan menggunakan layanan RTS Alibaba Cloud secara luas dengan cara yang nyaman dan dikelola sendiri.

GRTN kini menawarkan ketahanan terhadap kondisi jaringan buruk.

Prasyarat

Alur interaksi signaling

Gambar berikut menunjukkan alur interaksi signaling:

001

Alur interaksi signaling

  1. Klien mengirim permintaan offer.
    1. Klien membuat RTCPeerConnection lokal, mengatur properti Stream Direction untuk menerima audio dan video, serta membuat offer SDP.
      // Aktifkan audio dan video, recvonly atau sendonly
      { offerToReceiveVideo: true, offerToReceiveAudio: true }
    2. Klien mengirim permintaan penarikan aliran dalam format JSON ke layanan ApsaraVideo Live melalui permintaan POST HTTPS. Untuk informasi lebih lanjut mengenai format protokol, lihat Definisi protokol signaling.
      • version menentukan versi protokol. Versi saat ini tetap di angka 2.
      • sdk_version menentukan versi SDK. Anda dapat menyesuaikan bidang ini.
    3. Setelah konten protokol dibuat, klien mengirimkannya ke titik akhir signaling layanan ApsaraVideo Live dalam permintaan POST untuk menyelesaikan interaksi signaling. Badan respons JSON berisi URL aliran yang akan ditarik.
      POST /app/streamname?auth=xxx HTTP/1.1
      Host: domain
      Connection: keep-alive
      Content-Length: 2205
      Content-Type: application/json
      Catatan Titik akhir signaling hampir sama dengan URL aliran, tetapi awalan protokolnya berbeda:
      • Titik akhir signaling: https://domain/app/streamname?auth=xxx.
      • URL aliran: artc://domain/app/streamname?auth=xxx.
  2. Server merespons dengan jawaban SDP.

    Server ApsaraVideo Live memverifikasi keamanan permintaan, menghasilkan jawaban SDP, dan mengembalikan informasi node kepada klien dalam badan respons. Untuk informasi lebih lanjut mengenai format protokol, lihat Definisi protokol signaling.

  3. Klien menetapkan koneksi ICE.
    1. Setelah klien menerima jawaban SDP, klien menetapkannya pada RTCPeerConnection.
      peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep));
    2. RTCPeerConnection memulai proses pembentukan koneksi ICE dan proses DTLS berikutnya. Setelah saluran media terbentuk, klien dapat menerima aliran media dari layanan ApsaraVideo Live. Ini menyelesaikan akses WebRTC standar untuk penarikan aliran dan pemutaran.
  4. Putus koneksi.

    Untuk memutus koneksi dan menghentikan pengambilan atau pemutaran aliran, klien mengirim pesan DTLS Alert.

    断开连接
Contoh demo H5
// Buat koneksi peer dan local offer sdp.
peerConnection = new RTCPeerConnection();
peerConnection.onicecandidate = iceCandidateCallback;
peerConnection.ontrack = remoteStreamCallback;
peerConnection.createOffer({ offerToReceiveVideo: true, offerToReceiveAudio: true })
      .then(signaling_pull).catch(errorHandler);


// Kirim permintaan penarikan aliran ke ApsaraVideo Live.
function signaling_pull(offer_sdp) {
  console.log('local offer sdp', offer_sdp);

  peerConnection.setLocalDescription(offer_sdp).then(function() {
    // Dapatkan URL penarikan aliran.
    var stream_url = $("#stream_url").val();
    console.log("stream url:" , stream_url);

    // Tambahkan versi sdk dan protokol.
    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);
}
                

Definisi protokol signaling

Protokol signaling RTS menggunakan HTTPS (koneksi singkat) dan format JSON. Berikut adalah contohnya:

{
    "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... Omitted ..."
    }
}

Pemutaran

  • Deskripsi protokol pemutaran
    Tabel 1. Parameter permintaan
    ParameterTypeWajibDeskripsi
    modestringYaMode. Tetapkan nilainya ke live.
    versionintYaNomor versi protokol. Tetapkan nilainya ke 2.
    push_streamstringTidakURL pengambilan aliran.
    pull_streams[]objectTidakObjek penarikan aliran. Beberapa aliran dapat ditarik. Untuk informasi selengkapnya, lihat tabel berikut.
    sdk_versionstringTidakNomor versi SDK.
    jsep.typestringYaTipe SDP. Tetapkan nilainya ke offer.
    jsep.sdpstringYaDeskripsi SDP.
    Tabel 2. Parameter pull_stream
    BidangTypeWajibDeskripsi
    urlstringYaURL penarikan aliran. Contoh: artc://<pull_stream_url>.
    amsid[]stringYamsid audio untuk penarikan aliran. Dalam skenario live streaming, tetapkan nilainya ke rts audio.
    vmsid[]stringYamsid video untuk penarikan aliran. Dalam skenario live streaming, tetapkan nilainya ke rts video.
    Tabel 3. Parameter respons
    BidangTypeWajibDeskripsi
    codeintYaKode balasan. Nilai 200 menunjukkan keberhasilan. Untuk informasi selengkapnya mengenai kode kesalahan, lihat tabel deskripsi kode kesalahan di bawah.
    trace_idstringYaID permintaan unik global yang dihasilkan oleh CDN. Simpan ID ini untuk membantu melacak dan memecahkan masalah permintaan.
    jsep.typestringYaTipe SDP. Tetapkan nilainya ke answer.
    jsep.sdpstringYaSDP yang dihasilkan oleh CDN Alibaba Cloud untuk pengambilan asal.
  • Contoh permintaan pemutaran
    Request:
    {
        "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... Omitted ..."
        }
    }
    
    Response:
    {
        "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 ... Omitted ..."
        }
    }

    sps-pps-idr-in-keyframe: Untuk mencegah artefak video selama pemutaran di jaringan buruk, modifikasi SDP.

    Setelah offer dihasilkan untuk aliran langganan H5 (recvonly) dan sebelum Anda memanggil setLocalDescription, modifikasi SDP. Temukan baris dalam properti video H.264 yang mirip dengan berikut:
    a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
    Tambahkan sps-pps-idr-in-keyframe=1 ke baris tersebut:
    a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f;sps-pps-idr-in-keyframe=1

    GRTN merespons perubahan ini dan mengaktifkan fitur tersebut di browser.

  • Penanganan kesalahan

    Jika permintaan signaling valid, server mengembalikan respons 200. Untuk memperoleh hasil spesifik, uraikan properti code dalam badan respons JSON. Properti code mengikuti pola kode respons HTTP. Berikut adalah contohnya:

    Response:
    {
       "code": 200, // 200: Sukses. Untuk kode non-200, lihat definisi di bawah.
       "message": "success"  // Deskripsi untuk kode kesalahan non-200.
    }
    Tabel 4. Parameter respons
    ParameterTypeDeskripsi
    codeintKode respons. Untuk informasi selengkapnya mengenai format dan definisi, lihat tabel berikut.
    messagestringDeskripsi kesalahan.
    Tabel 5. Deskripsi kode kesalahan
    Kode kesalahanDeskripsi
    403Autentikasi gagal.
    404Aliran tidak ada.
    611Klien harus fallback ke TCP untuk pemutaran.
    302Klien harus mengirim permintaan signaling baru ke titik akhir layanan baru.

Pengambilan aliran

  • Deskripsi protokol pengambilan aliran
    Tabel 6. Parameter permintaan
    ParameterTipeWajibDeskripsi
    modestringYaMode. Tetapkan nilainya ke live.
    versionintYaNomor versi protokol. Tetapkan nilainya ke 2.
    push_streamstringTidakURL pengambilan aliran.
    sdk_versionstringTidakNomor versi SDK.
    jsep.typestringYaTipe SDP. Tetapkan nilainya ke offer.
    jsep.sdpstringYaDeskripsi SDP.
    Tabel 7. Parameter respons
    BidangTypeWajibDeskripsi
    codeintYaKode balikan. Nilai 200 menunjukkan keberhasilan. Untuk informasi selengkapnya mengenai kode kesalahan, lihat tabel deskripsi kode kesalahan di bawah.
    trace_idstringYaID permintaan unik global yang dihasilkan oleh CDN. Simpan ID ini untuk membantu melacak dan memecahkan masalah permintaan.
    jsep.typestringYaTipe SDP. Tetapkan nilainya ke answer.
    jsep.sdpstringYaSDP yang dihasilkan oleh CDN Alibaba Cloud untuk pengambilan asal.
  • Contoh permintaan pengambilan aliran
    Request:
    {
        "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"
        }
    }
    
    Response:
    {
        "trace_id":"...",
        "code":200,
        "jsep":{
            "type":"answer",
            "sdp":"v=0\r\no=- 1657264764 2 IN IP4 127.0.0.1 ... Omitted ..."
        }
    }
                        
    Dalam pesan signaling, push_stream menentukan URL pengambilan aliran. Ini mirip dengan pengambilan aliran RTMP. Catatan:
    • Anda harus menentukan msid dalam SDP. GRTN menggunakan msid sebagai pengenal unik untuk media.
    • Negosiasi media tidak didukung untuk pengambilan aliran. Untuk satu msid media yang ditentukan oleh klien, hanya satu jenis pengkodean yang diizinkan. GRTN tidak melakukan seleksi. GRTN saat ini mendukung AAC, Opus, H.264, dan H.265.
    • audioaudio1audio2
    • videovideo1video2
  • Penanganan kesalahan

    Jika permintaan signaling valid, server mengembalikan respons 200. Untuk memperoleh hasil spesifik, uraikan properti code dalam badan respons JSON. Properti code mengikuti pola kode respons HTTP. Berikut adalah contohnya:

    Response:
    {
       "code": 200, // 200: Sukses. Untuk kode non-200, lihat definisi di bawah.
       "message": "success"  // Deskripsi untuk kode kesalahan non-200.
    }
    Tabel 8. Parameter respons
    ParameterTipeDeskripsi
    codeintKode respons. Untuk informasi selengkapnya mengenai format dan definisi, lihat tabel berikut.
    messagestringDeskripsi kesalahan.
    Tabel 9. Deskripsi kode kesalahan
    Kode kesalahanDeskripsi
    403Autentikasi gagal.
    611Klien harus fallback ke TCP.
    302Klien harus mengirim permintaan signaling baru ke titik akhir layanan baru.

SDP Enhanced

Selama signaling, SDP digunakan untuk menggambarkan informasi media. Negosiasi SDP umum didasarkan pada RFC 4566. Alibaba Cloud RTS memperluasnya dengan semantik yang lebih kaya yang kompatibel dengan industri live streaming. RTS mendukung lebih banyak format enkapsulasi audio dan video serta protokol komunikasi. Hal ini mengatasi keterbatasan WebRTC, seperti hanya mendukung audio Opus dan tidak mendukung B-frame dalam video, untuk memenuhi kebutuhan industri media streaming yang terus berkembang.

Dukungan audio AAC dalam pengambilan dan penarikan aliran

RTS mendukung transportasi format audio AAC apa pun yang dapat ditransportasikan dalam RTMP, termasuk AAC-LC, HE-AACv1, dan HE-AACv2.

RTS mendukung transportasi audio AAC dalam format LATM. LATM dapat mentransmisikan informasi pengkodean audio baik in-band (dikirim bersama setiap paket audio) maupun out-of-band (dikirim hanya sekali), tergantung pada apakah aliran audio itu sendiri berisi informasi ini. Hal ini ditentukan oleh muxconfigPresent dalam Audio Mux Element. Ini membuat LATM lebih fleksibel daripada ADTS. Jika AudioSpecificConfig tidak berubah, informasi StreamMuxConfig (AudioSpecificConfig) dapat ditransmisikan awal dalam sesi SDP.

  • Dukungan pengambilan aliran untuk audio AAC

    SDP offer dapat menyertakan informasi AAC untuk memberi tahu server tentang format audio yang diambil. Anda juga dapat menambahkan config=StreamMuxConfig ke baris FMTP. Konfigurasi ini disusun dari informasi AudioSpecificConfig dari aliran yang diambil dan mentransmisikan informasi ini ke server untuk menghasilkan header AAC.

    offer SDP:
    a=rtpmap:125 MP4A-LATM/48000/2
    a=fmtp:125 config=4000232000;cpresent=0;object=2;profile-level-id=1
  • Dukungan penarikan aliran untuk audio AAC

    Selama interaksi signaling, RTS mengurai informasi pengkodean audio dari sumber ingest dan mengembalikan informasi yang sesuai dalam respons negosiasi. Tabel berikut memberikan detailnya.

    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

    Di sini, penambahan SBR-enabled=1 ke baris fmtp audio MP4A-LATM dalam answer SDP menunjukkan HE-AAC. Penambahan kedua SBR-enabled=1 dan PS-enabled=1 menunjukkan HE-AACv2. Pengenal SBR dan PS ditambahkan secara progresif untuk merepresentasikan berbagai format AAC, mencerminkan perkembangan teknologi dari AAC-LC ke HE-AACv2. Selain itu, config=StreamMuxConfig ditambahkan ke baris fmtp. Ini disusun dari informasi AudioSpecificConfig dari aliran yang diambil dan memberikan informasi rinci mengenai parameter pengkodean audio. Klien dapat menggunakan informasi ini sesuai kebutuhan.

    002

Dukungan video H.265 dalam pengambilan dan penarikan aliran

  • Dukungan pengambilan aliran untuk video H.265

    SDP offer dapat menyertakan informasi H.265 untuk memberi tahu server tentang format video yang diambil.

    Offer SDP:
    a=rtpmap:102 H265/90000 
  • Dukungan penarikan aliran untuk video H.265

    Selama interaksi signaling untuk penarikan aliran, server memperoleh informasi pengkodean video (seperti H.264 atau H.265) dari aliran sumber dan melakukan negosiasi berdasarkan informasi ini.

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

Dukungan video dengan B-frame dalam pengambilan dan penarikan aliran

  • Dukungan pengambilan aliran untuk B-frame

    Aliran sumber untuk pengambilan dapat berisi B-frame.

  • Dukungan penarikan aliran untuk B-frame

    Selama interaksi signaling, klien dapat menambahkan bidang ke offer SDP untuk menunjukkan apakah klien mendukung penguraian video dengan B-frame. Misalnya, tambahkan BFrame-enabled = 1 ke baris fmtp video untuk menunjukkan dukungan terhadap B-frame. Dalam hal ini, RTP timestamp = PTS, dan nomor urut bertambah. Klien dapat melakukan decoding normal berdasarkan nomor urut. Jika B-frame tidak didukung, RTS dapat melakukan transkode aliran video sumber untuk menghapus B-frame.

    Saat B-frame ada, RTP timestamp = PTS, dan nomor urut bertambah. Klien dapat melakukan decoding normal berdasarkan nomor urut.

    Server juga mendukung pengembalian header ekstensi commit timestamp (CTS) tambahan untuk klien yang memerlukan perhitungan akurat DTS (PTS = DTS + CTS). Jika offer SDP berisi a=extmap:{$id} uri:webrtc:rtc:rtp-hdrext:video:CompositionTime, RTS menambahkan header ekstensi CTS dengan pengenal ekstensi = {$id} ke paket RTP pertama dari setiap frame video. ID ditentukan oleh offer SDP.

    RTS memberikan fleksibilitas kepada klien untuk memutuskan apakah akan menerima video dengan B-frame dan apakah mereka memerlukan informasi CTS tambahan. Membangun kemampuan komunikasi yang lebih universal adalah prinsip inti RTS.

Gambar berikut menunjukkan cuplikan offer SDP dan contoh paket yang ditangkap dari penarikan aliran:

Offer SDP片段004

Dukungan membawa metadata dalam signaling untuk pengambilan aliran

Pengambilan aliran RTMP menggunakan metadata RTMP untuk membawa metadata, yang dapat memberikan informasi ke callback pengambilan dan klien penarikan aliran. Karena transport WebRTC tidak mendukung metadata secara native, RTS mendukung pembawaan informasi tambahan dalam pesan signaling untuk menghasilkan metadata dalam aliran yang diambil.

Tambahkan bidang metadata ke badan pesan signaling pengambilan aliran:

{
    "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"
    }
}

Konsep MSID

Untuk informasi selengkapnya mengenai MSID, lihat The Msid Mechanism. Perhatikan hal berikut:Msid