Real-Time Streaming (RTS) diwujudkan berdasarkan metode sinyal Web Real-Time Communication (WebRTC). RTS mendukung streaming langsung dengan latensi rendah melalui titik kehadiran Alibaba Cloud di seluruh dunia (POPs) dan algoritma penjadwalan yang canggih dari Alibaba Cloud. Topik ini menjelaskan spesifikasi protokol sinyal RTS, ditujukan untuk pengembang yang memahami dasar-dasar WebRTC.
Proses sinyal
Gambar berikut mengilustrasikan proses sinyal.
Proses Sinyal
Klien mengirim permintaan dengan penawaran Session Description Protocol (SDP).
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 }Kirim permintaan tarik aliran dari klien ke ApsaraVideo Live menggunakan metode HTTPS POST. Badan permintaan adalah string JSON. Untuk detail parameter permintaan, lihat bagian Definisi Protokol Sinyal RTS.
nullParameter
versionmenentukan versi protokol sinyal RTS. Atur nilainya menjadi 2.Parameter
sdk_versionmenentukan versi SDK RTS. Sesuaikan nilai sesuai kebutuhan.
Kirim permintaan yang telah dibuat ke ApsaraVideo Live berdasarkan URL sinyal 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/jsonnullKonten URL sinyal pada dasarnya sama dengan URL sumber, kecuali header protokolnya. Contoh:
URL Sinyal:
https://domain/app/streamname?auth=xxxURL Sumber:
artc://domain/app/streamname?auth=xxx
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 detail parameter respons, lihat bagian Definisi Protokol Sinyal RTS.
Klien memulai Interactive Connectivity Establishment (ICE).
Setelah klien menerima respons dengan jawaban SDP, tentukan deskripsi sesi dalam objek RTCPeerConnection.
peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep));Gunakan objek RTCPeerConnection untuk memulai ICE dan enkripsi Datagram Transport Layer Security (DTLS). Setelah saluran sinyal terbentuk, klien dapat menarik aliran dari ApsaraVideo Live. Dengan cara ini, Anda dapat mengimplementasikan penarikan aliran dan pemutaran berdasarkan standar WebRTC.
Klien memulai pemutusan.
Klien mengirim pesan peringatan DTLS yang memulai pemutusan untuk menghentikan ingest atau pemutaran aliran.

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);
// CDN live post pull stream request.
function signaling_pull(offer_sdp) {
console.log('local offer sdp', offer_sdp);
peerConnection.setLocalDescription(offer_sdp).then(function() {
// Dapatkan url aliran tarik.
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 Sinyal RTS
Protokol sinyal RTS membentuk koneksi singkat berbasis HTTPS. Protokol ini menggunakan pesan dalam format JSON. Bagian ini menjelaskan permintaan, respons, dan kode kesalahan berdasarkan protokol sinyal RTS.
Contoh Permintaan
Permintaan:
{
"version":2,
"sdk_version":"0.0.1",
"mode":"live",
"pull_streams":[
{
"url":"artc://demo.aliyundoc.com/liveApp****/liveStream****",
"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"
}
}Parameter | Tipe | Diperlukan | Deskripsi |
mode | string | Ya | Mode aliran. 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 | Aliran yang ingin Anda tarik. Anda dapat menarik beberapa aliran 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. |
Atribut | Tipe | Diperlukan | Deskripsi |
url | string | Ya | URL sumber yang dimulai dengan |
amsid | []string | Ya | ID aliran media (MSID) dari aliran audio yang ingin Anda tarik. Dalam contoh ini, atur parameter ke |
vmsid | []string | Ya | MSID dari aliran video yang ingin Anda tarik. Dalam contoh ini, atur parameter ke |
Contoh Respons Sukses
Respons:
{
"trace_id":"2_1591173296_101.227.XX.XX_702080732320_dec327eb6eed0e0b07b349c8a565****",
"code":200,
"jsep":{
"type":"answer",
"sdp":"v=0\r\no=- 1591173291 2 IN IP4 127.0.0.1\n\r Konten yang dihilangkan"
}
}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 saat POP menarik aliran dari asal. |
Kode status | Deskripsi |
403 | Menunjukkan bahwa autentikasi gagal. |
404 | Menunjukkan bahwa aliran tidak ada. |
611 | Menunjukkan bahwa klien harus memutar aliran melalui TCP. |
302 | Menunjukkan bahwa klien harus mengirim permintaan ke alamat baru. |
Negosiasi SDP yang ditingkatkan
Pesan dipertukarkan dalam format SDP selama sinyal. 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, sehingga menyelesaikan masalah bahwa WebRTC hanya mendukung format Opus untuk audio dan tidak mendukung B-frame.
Dukungan Audio AAC
RTS dapat mentransmisikan audio dalam berbagai format AAC melalui RTMP, termasuk AAC-LC, HE-AACv1, dan HE-AACv2. Untuk informasi lebih lanjut tentang format AAC, lihat ISO IEC 14496-3.
RTS dapat mentransmisikan audio dalam format AAC menggunakan format kontainer Low-overhead MPEG-4 Audio Transport Multiplex (LATM). LATM menentukan apakah informasi pengkodean audio ditransmisikan dalam mode in-band atau out-of-band berdasarkan apakah audio berisi informasi pengkodean. Transmisi in-band mengirimkan informasi pengkodean untuk setiap frame audio, sedangkan 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.
Selama sinyal, RTS mengurai informasi pengkodean selama ingest aliran 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 | |
| | | |
| | | |
Jika SBR-enabled=1 ditambahkan dalam atribut fmtp MP4A-LATM, format AAC adalah AAC-HE. Jika SBR-enabled=1 dan PS-enabled=1 ditambahkan, format AAC adalah HE-AACv2. Format AAC berkembang 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 aliran yang di-ingest dan berisi parameter yang terkait dengan detail informasi pengkodean. Klien dapat memperoleh detail sesuai kebutuhan.

Untuk informasi lebih lanjut, lihat Parameter Encoder AAC-LC / HE-AACv1 / HE-AACv2.
Dukungan Video H.265
RTS mengurai informasi pengkodean video dalam format H.264 atau H.265 selama ingest aliran dan mengembalikan informasi tentang video dalam format H.264 atau H.265 dalam jawaban SDP.
Format pengkodean | Penawaran SDP | Jawaban SDP |
H.265 | | |
Dukungan Video yang Mengandung B-frame
Selama proses sinyal, 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 aliran sumber untuk menghapus B-frame.
Selain itu, server dapat mengembalikan composition timestamp (CTS). Hal ini memungkinkan klien untuk 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. Gambar berikut menunjukkan sebagian konten dari penawaran SDP dan tangkapan paket selama penarikan aliran:


RTS memungkinkan klien menentukan apakah akan mendekode video yang mengandung B-frame dan apakah akan mengembalikan informasi CTS. Hal ini memastikan kemampuan komunikasi secara umum.
Mekanisme MSID
Untuk informasi lebih lanjut tentang MSID, lihat Mekanisme Msid.