全部产品
Search
文档中心

ApsaraVideo Live:Spesifikasi signaling WebRTC yang digunakan untuk mengakses GRTN

更新时间:Jul 06, 2025

Streaming Real-Time (RTS) diimplementasikan berdasarkan signaling Web Real-Time Communication (WebRTC). RTS mencapai streaming langsung dengan latensi ultra-rendah melalui node Content Delivery Network (CDN) Alibaba Cloud yang tersebar di seluruh dunia dan algoritma penjadwalan yang optimal. Topik ini menjelaskan spesifikasi signaling WebRTC yang digunakan untuk mengakses Global Realtime Transport Network (GRTN). Dokumen ini ditujukan bagi pengembang yang memahami dasar-dasar WebRTC.

Informasi latar belakang

Streaming langsung menggunakan protokol Transmission Control Protocol (TCP) memiliki latensi sekitar 3 hingga 6 detik. Untuk mengurangi latensi, ApsaraVideo Live menyediakan fitur bernilai tambah RTS, yang memungkinkan Anda melakukan streaming langsung melalui protokol User Datagram Protocol (UDP). RTS menawarkan layanan streaming berkualitas tinggi, lancar, dan mudah diakses dengan latensi ultra-rendah dalam milidetik serta mampu menangani puluhan juta permintaan bersamaan. Dalam desain RTS, perhatian besar diberikan pada pembangunan ekosistem terbuka dan standar. Selain SDK RTS yang disediakan oleh ApsaraVideo Live, Anda juga dapat menggunakan klien sendiri untuk mendorong atau menarik stream dari node CDN menggunakan metode signaling serupa dengan WebRTC. ApsaraVideo Live menyediakan node CDN global dan algoritma penjadwalan canggih untuk membantu Anda mengelola dan menggunakan layanan RTS dalam skala besar.

GRTN memberikan performa yang baik bahkan dalam kondisi jaringan buruk.

Prasyarat

Proses signaling

Gambar berikut menunjukkan proses signaling.

001

Proses Signaling

  1. Klien mengirimkan permintaan dengan penawaran Session Description Protocol (SDP).

    1. Buat objek RTCPeerConnection di klien, tentukan apakah akan menerima atau mengirim sinyal audio dan video, lalu buat penawaran SDP.

      // Tentukan apakah akan menerima atau mengirim sinyal audio dan video.
      { offerToReceiveVideo: true, offerToReceiveAudio: true }
    2. Kirim permintaan penarikan stream dari klien ke ApsaraVideo Live menggunakan metode POST HTTPS. Badan permintaan adalah string JSON. Untuk informasi lebih lanjut tentang parameter permintaan, lihat bagian Definisi Protokol Signaling RTS dari topik ini.

      • Parameter version menentukan versi protokol signaling RTS. Atur nilainya menjadi 2.

      • Parameter sdk_version menentukan versi RTS SDK. Anda dapat mengatur parameter sesuai kebutuhan.

    3. Kirim permintaan yang telah dibuat ke ApsaraVideo Live berdasarkan URL signaling menggunakan metode POST. Tentukan URL sumber dalam badan permintaan berformat JSON.

      POST /app/streamname?auth=xxx HTTP/1.1
      Host: domain
      Connection: keep-alive
      Content-Length: 2205
      Content-Type: application/json
      Catatan

      Isi URL signaling pada dasarnya sama dengan URL sumber, kecuali header protokol. URL berikut memberikan contoh:

      • URL signaling: https://domain/app/streamname?auth=xxx

      • URL sumber: artc://domain/app/streamname?auth=xxx

  2. Server mengembalikan respons dengan jawaban SDP.

    Setelah server ApsaraVideo Live memverifikasi permintaan, server menghasilkan jawaban SDP dan mengembalikan respons yang berisi informasi tentang node streaming langsung ke klien. Untuk informasi lebih lanjut tentang parameter respons, lihat bagian Definisi Protokol Signaling RTS dari topik ini.

  3. Klien memulai Interactive Connectivity Establishment (ICE).

    1. Setelah klien menerima respons dengan jawaban SDP, tentukan deskripsi sesi dalam objek RTCPeerConnection.

      peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep));
    2. Gunakan objek RTCPeerConnection untuk memulai ICE dan enkripsi Datagram Transport Layer Security (DTLS). Setelah saluran signaling didirikan, klien dapat menarik stream dari ApsaraVideo Live. Dengan cara ini, Anda dapat mengimplementasikan penarikan stream dan pemutaran berdasarkan standar WebRTC.

  4. Klien memulai pemutusan.

    Klien mengirim pesan peringatan DTLS yang memulai pemutusan untuk menghentikan ingest atau pemutaran stream.

    Disconnect

Contoh Kode untuk Pemutar HTML5

// 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);


// Permintaan tarik stream CDN live post.
function signaling_pull(offer_sdp) {
  console.log('local offer sdp', offer_sdp);

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

    // Tambahkan sdk dan versi 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 RTS

Protokol signaling RTS mendirikan koneksi singkat berbasis HTTPS. Protokol ini menggunakan pesan dalam format JSON. Contoh kode:

{
    "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 Konten yang dihilangkan"
    }
}

Pemutaran

  • Deskripsi Protokol tentang Pemutaran

    Tabel 1. Parameter Permintaan

    Parameter

    Tipe

    Diperlukan

    Deskripsi

    mode

    string

    Ya

    Mode stream. Dalam contoh ini, atur parameter ke live.

    version

    int

    Ya

    Versi protokol. Dalam contoh ini, atur parameter ke 2.

    push_stream

    string

    Tidak

    URL ingest.

    pull_streams

    []object

    Tidak

    Stream yang ingin Anda tarik. Anda dapat menarik beberapa stream sekaligus. Untuk informasi lebih lanjut tentang atribut parameter pull_stream, lihat tabel berikut.

    sdk_version

    string

    Tidak

    Versi SDK.

    jsep.type

    string

    Ya

    Tipe pesan SDP. Dalam contoh ini, atur parameter ke offer.

    jsep.sdp

    string

    Ya

    Deskripsi pesan SDP.

    Tabel 2. Atribut Parameter pull_stream

    Atribut

    Tipe

    Diperlukan

    Deskripsi

    url

    string

    Ya

    URL sumber yang dimulai dengan artc://.

    amsid

    []string

    Ya

    ID stream media (MSID) dari stream audio yang ingin Anda tarik. Dalam contoh ini, atur parameter ke rts audio.

    vmsid

    []string

    Ya

    MSID dari stream video yang ingin Anda tarik. Dalam contoh ini, atur parameter ke rts video.

    Tabel 3. Parameter Respons

    Parameter

    Tipe

    Diperlukan

    Deskripsi

    code

    int

    Ya

    Kode status HTTP. Jika permintaan berhasil, kode 200 dikembalikan. Untuk informasi lebih lanjut tentang kode status, lihat bagian "Kode status".

    trace_id

    string

    Ya

    ID unik global (GUID) dari permintaan. GUID dihasilkan oleh Alibaba Cloud CDN dan dapat digunakan untuk memecahkan masalah. Simpan GUID dengan baik.

    jsep.type

    string

    Ya

    Tipe pesan SDP. Dalam contoh ini, nilai answer dikembalikan. .

    jsep.sdp

    string

    Ya

    Deskripsi pesan SDP yang dihasilkan ketika node CDN menarik stream dari asal.

  • Contoh Permintaan Pemutaran

    Permintaan:
    {
        "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 Konten yang dihilangkan"
        }
    }
    
    Respons:
    {
        "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 Konten yang dihilangkan"
        }
    }

    sps-pps-idr-in-keyframe: Kami merekomendasikan Anda melakukan operasi berikut untuk mencegah kedipan layar saat browser memutar stream langsung dalam kondisi jaringan yang buruk.

    Setelah penawaran SDP dibuat untuk stream yang berlangganan untuk pemutaran HTML5 dan sebelum Anda memanggil setLocalDescription, modifikasi pesan SDP. Temukan baris serupa dengan yang berikut ini tentang atribut video H.264:

    a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f

    Tambahkan sps-pps-idr-in-keyframe=1. Baris tersebut menjadi:

    a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f;sps-pps-idr-in-keyframe=1

    GRTN merespons dan mengaktifkan fitur tersebut untuk browser.

  • Penanganan Kesalahan

    Jika permintaan penarikan stream valid, kode status HTTP 200 dikembalikan. Hasil penanganan kesalahan bervariasi berdasarkan kode status HTTP yang dikembalikan dalam badan respons berformat JSON. Tabel berikut menunjukkan parameter kode dan pesan dalam respons:

    Respons:
    {
       "code": 200, // Nilai 200 menunjukkan bahwa permintaan berhasil. Untuk informasi lebih lanjut tentang kode status, lihat bagian "Kode status".
       "message": "success" // Pesan yang dikembalikan.
    }

    Tabel 4. Parameter Respons

    Parameter

    Tipe

    Deskripsi

    code

    int

    Kode status HTTP. Untuk informasi lebih lanjut, lihat bagian "Kode status".

    message

    string

    Pesan yang dikembalikan.

    Tabel 5. Kode Status

    Kode status

    Deskripsi

    403

    Menunjukkan bahwa autentikasi gagal.

    404

    Menunjukkan bahwa stream tidak ada.

    611

    Menunjukkan bahwa klien harus memutar stream melalui TCP.

    302

    Menunjukkan bahwa klien harus mengirim permintaan ke alamat baru.

Ingest stream

  • Deskripsi Protokol tentang Ingest Stream

    Tabel 6. Parameter Permintaan

    Parameter

    Tipe

    Diperlukan

    Deskripsi

    mode

    string

    Ya

    Mode stream. Dalam contoh ini, atur parameter ke live.

    version

    int

    Ya

    Versi protokol. Dalam contoh ini, atur parameter ke 2.

    push_stream

    string

    Tidak

    URL ingest.

    sdk_version

    string

    Tidak

    Versi SDK.

    jsep.type

    string

    Ya

    Tipe pesan SDP. Dalam contoh ini, atur parameter ke offer.

    jsep.sdp

    string

    Ya

    Deskripsi pesan SDP.

    Tabel 7. Parameter Respons

    Parameter

    Tipe

    Diperlukan

    Deskripsi

    code

    int

    Ya

    Kode status HTTP. Jika permintaan berhasil, kode 200 dikembalikan. Untuk informasi lebih lanjut tentang kode status, lihat bagian "Kode status".

    trace_id

    string

    Ya

    GUID dari permintaan. GUID dihasilkan oleh Alibaba Cloud CDN dan dapat digunakan untuk memecahkan masalah. Simpan GUID dengan baik.

    jsep.type

    string

    Ya

    Tipe pesan SDP. Dalam contoh ini, nilai answer dikembalikan.

    jsep.sdp

    string

    Ya

    Deskripsi pesan SDP yang dihasilkan ketika node CDN menarik stream dari asal.

  • Contoh Permintaan Ingest Stream

    Permintaan:
    {
        "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"
        }
    }
    
    Respons:
    {
        "trace_id":"...",
        "code":200,
        "jsep":{
            "type":"answer",
            "sdp":"v=0\r\no=- 1657264764 2 IN IP4 127.0.0.1 Konten yang dihilangkan"
        }
    }
                        

    Dalam permintaan signaling sebelumnya, push_stream menunjukkan URL ingest, yang serupa dengan ingest stream melalui Real-Time Messaging Protocol (RTMP). Perhatikan poin-poin berikut:

    • Anda harus menentukan MSID dalam pesan SDP. GRTN menggunakan MSID untuk mengidentifikasi stream media.

    • Stream media tidak mendukung negosiasi. Untuk MSID yang ditentukan oleh klien, hanya satu codec yang diizinkan. GRTN tidak membuat pilihan. Codec yang didukung termasuk Advanced Audio Coding (AAC), Opus, H.264, dan H.265.

    • Contoh Kode untuk Audioaudio1audio2

    • Videovideo1video2

  • Penanganan Kesalahan

    Jika permintaan penarikan stream valid, kode status HTTP 200 dikembalikan. Hasil penanganan kesalahan bervariasi berdasarkan kode status HTTP yang dikembalikan dalam badan respons berformat JSON. Tabel berikut menunjukkan parameter kode dan pesan dalam respons:

    Respons:
    {
       "code": 200, // Nilai 200 menunjukkan bahwa permintaan berhasil. Untuk informasi lebih lanjut tentang kode status, lihat bagian "Kode status".
       "message": "success" // Pesan yang dikembalikan.
    }

    Tabel 8. Parameter Respons

    Parameter

    Tipe

    Deskripsi

    code

    int

    Kode status HTTP. Untuk informasi lebih lanjut, lihat bagian "Kode status".

    message

    string

    Pesan yang dikembalikan.

    Tabel 9. Kode Status

    Kode status

    Deskripsi

    403

    Menunjukkan bahwa autentikasi gagal.

    611

    Menunjukkan bahwa klien harus memutar stream melalui TCP.

    302

    Menunjukkan bahwa klien harus mengirim permintaan ke alamat baru.

Negosiasi SDP yang ditingkatkan

Pesan dipertukarkan dalam format SDP selama signaling. Negosiasi SDP umumnya didasarkan pada RFC 4566. RTS memperluas lebih banyak semantik untuk membuat negosiasi kompatibel dengan karakteristik industri streaming langsung. RTS mendukung lebih banyak format kontainer video dan audio serta lebih banyak protokol komunikasi. Dengan cara ini, RTS menyelesaikan masalah bahwa WebRTC hanya mendukung format Opus untuk audio dan tidak mendukung B-frame. RTS memenuhi kebutuhan protokol streaming yang terus meningkat.

AAC didukung untuk ingest dan penarikan stream

RTS dapat mentransmisikan audio dalam berbagai format AAC melalui RTMP. Format AAC termasuk AAC-LC, HE-AACv1, dan HE-AACv2.

RTS dapat mentransmisikan audio dalam format AAC menggunakan container Low-overhead MPEG-4 Audio Transport Multiplex (LATM). LATM menentukan apakah informasi pengkodean tentang audio ditransmisikan dalam mode in-band atau out-of-band berdasarkan apakah audio mengandung informasi pengkodean. Transmisi in-band mengirimkan informasi pengkodean untuk setiap frame audio. Transmisi out-of-band mengirimkan informasi pengkodean hanya sekali. Parameter muxconfigPresent dalam array AudioMuxElement menentukan apakah informasi dalam AudioSpecificConfig ditransmisikan dalam mode in-band atau out-of-band. Oleh karena itu, LATM lebih fleksibel daripada Audio Data Transport Stream (ADTS). Jika informasi dalam AudioSpecificConfig tetap tidak berubah, informasi dalam StreamMuxConfig dapat pertama kali ditransmisikan dalam pesan SDP.

  • AAC Didukung untuk Ingest Stream

    Anda dapat memberi tahu server tentang format audio AAC dengan membawa informasi terkait dalam penawaran SDP. Selain itu, Anda dapat menambahkan config=StreamMuxConfig, yang diperoleh dari AudioSpecificConfig dari stream yang diingest, dalam atribut fmtp. Dengan cara ini, parameter AudioSpecificConfig dapat dibawa ke server untuk menghasilkan header AAC.

    Penawaran SDP

    a=rtpmap:125 MP4A-LATM/48000/2
    a=fmtp:125 config=4000232000;cpresent=0;object=2;profile-level-id=1
  • AAC Didukung untuk Penarikan Stream

    Selama signaling, RTS menguraikan informasi pengkodean selama ingest stream audio dan mengembalikan informasi yang diuraikan dalam respons negosiasi, seperti yang ditunjukkan dalam kode berikut.

    Penawaran SDP

    Jawaban SDP

    AAC-LC

    HE-AACv1

    HE-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

    Jika SBR-enabled=1 ditambahkan dalam atribut fmtp dari MP4A-LATM, format AAC adalah AAC-HE. Jika SBR-enabled=1 dan PS-enabled=1 ditambahkan, format AAC adalah HE-AACv2. Format AAC berevolusi dari AAC-LC ke HE-AACv2. Oleh karena itu, bidang SBR dan PS dapat digunakan dalam atribut fmtp untuk menunjukkan format AAC. Selain itu, Anda dapat menambahkan config=StreamMuxConfig dalam atribut fmtp. StreamMuxConfig diperoleh dari AudioSpecificConfig dari stream yang diingest dan berisi parameter yang terkait dengan detail informasi pengkodean. Klien dapat memperoleh detail sesuai kebutuhan.

    002

H.265 didukung untuk ingest dan penarikan stream

  • H.265 Didukung untuk Ingest Stream

    Anda dapat memberi tahu server tentang format video H.265 dengan membawa informasi terkait dalam penawaran SDP.

    Penawaran SDP:

    a=rtpmap:102 H265/90000 
  • H.265 Didukung untuk Penarikan Stream

    Selama proses signaling penarikan stream, server memperoleh codec video dari stream sumber, seperti H.264, H.265, dan melakukan negosiasi berdasarkan informasi tersebut.

    Penawaran SDP

    Jawaban SDP

    a=rtpmap:102 H265/90000
    a=rtpmap:122 H265/90000
    a=fmtp:122

B-frame didukung untuk ingest dan penarikan stream

  • B-frame Didukung untuk Ingest Stream

    B-frame didukung dalam stream yang diingest.

  • B-frame Didukung untuk Penarikan Stream

    Selama signaling, klien dapat menambahkan bidang dalam penawaran SDP untuk menentukan apakah akan mendekode video yang mengandung B-frame. Sebagai contoh, jika klien menambahkan BFrame-enabled = 1 dalam atribut fmtp, klien dapat mendekode video yang mengandung B-frame. Dalam hal ini, RTP timestamp = PTS dapat ditambahkan, yang berarti bahwa klien mendekode setiap frame berdasarkan urutan nomor yang meningkat. Jika video yang mengandung B-frame tidak didukung, RTS dapat mentranskode stream sumber untuk menghapus B-frame.

    Untuk mendekode video yang mengandung B-frame, "RTP timestamp = PTS" dapat ditambahkan. Klien mendekode setiap frame berdasarkan urutan nomor yang meningkat.

    Selain itu, server dapat mengembalikan composition timestamp (CTS). Ini memungkinkan klien menghitung decoding timestamp (DTS) berdasarkan rumus berikut: Presentation timestamp (PTS) = DTS + CTS. Jika penawaran SDP berisi a=extmap:{$id} uri:webrtc:rtc:rtp-hdrext:video:CompositionTime, RTS menambahkan extension identifier = {$id} ke paket Real-time Transport Protocol (RTP) pertama dari setiap frame video. Nilai variabel id ditentukan oleh penawaran SDP yang dikirim oleh klien.

    RTS memungkinkan klien menentukan apakah akan mendekode video yang mengandung B-frame dan apakah akan mengembalikan informasi CTS. RTS menghargai metode umum dalam komunikasi sejak awal.

Gambar berikut menunjukkan konten sebagian dari penawaran SDP dan capture paket selama penarikan stream:

Partial content of the SDP offer004

Permintaan signaling yang membawa metadata didukung untuk ingest stream

Stream yang diingest melalui RTMP membawa metadata, yang dapat digunakan untuk mengembalikan callback dan menyediakan informasi untuk klien penarikan stream. Namun, proses signaling WebRTC tidak melibatkan metadata. Sebagai solusi perbaikan, RTS memungkinkan metadata dibawa dalam permintaan signaling. Dengan cara ini, metadata dapat dihasilkan dalam stream yang diingest.

Tambahkan bidang metadata ke badan permintaan signaling untuk stream yang diingest:

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

Mekanisme MSID

Untuk informasi lebih lanjut tentang MSID, lihat Mekanisme Msid. Perhatikan konten berikut.Msid