RTS超低延時直播是以WebRTC信令互動方式為基礎,藉助阿里雲直播節點的全球覆蓋及優秀調度演算法能力,實現功能。通過閱讀本文,您可以瞭解RTS信令協議的詳細資料。本文適合具有WebRTC基礎的開發人員閱讀。
信令互動流程
信令互動圖如下所示:
信令互動流程
用戶端發送offer請求。
用戶端本地建立RTCPeerConnection,設定接收音視頻屬性Stream Direction,並建立offer SDP。
// 開啟音視頻, recvonly or sendonly { offerToReceiveVideo: true, offerToReceiveAudio: true }用戶端向直播服務發送拉流請求,通過HTTPS POST協議方式將JSON格式的請求資訊發送至直播服務。協議格式請參見信令協議定義。
說明version欄位為協議版本,目前的版本固定為2。sdk_version欄位為SDK版本,您可以自訂該欄位。
產生協議內容後,通過POST方式將信令地址給直播服務完成信令互動,在請求的JSON包體中包含要拉取的流地址。
POST /app/streamname?auth=xxx HTTP/1.1 Host: domain Connection: keep-alive Content-Length: 2205 Content-Type: application/json說明信令地址與流地址基本一致,協議頭不同,如下所示:
信令地址:
https://domain/app/streamname?auth=xxx。流地址:
artc://domain/app/streamname?auth=xxx。
服務端SDP Answer響應。
直播服務端校正安全性後產生SDP Answer, 節點資訊封裝在響應包體中返回給用戶端。協議格式請參見信令協議定義。
用戶端ICE建聯。
用戶端收到SDP Answer響應後,設定到RTCPeerConnection中。
peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep));RTCPeerConnection啟動ICE建連流程以及後續的DTLS流程,媒體通道建立成功後可以擷取到直播服務輸出的媒體流,實現WebRTC標準接入拉流播放。
中斷連線。
用戶端需要中斷連線停止推流或播放,使用DTLS的Alert訊息表達。

H5 Demo樣本
// Create peer connection and 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() {
// Get pull stream url.
var stream_url = $("#stream_url").val();
console.log("stream url:" , stream_url);
// Add sdk and protocol versions.
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。協議詳情如下所示:
請求樣本
Request:
{
"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以下省略"
}
}參數 | 類型 | 是否必選 | 描述 |
mode | string | 是 | 模式,取值:live。 |
version | int | 是 | 協議版本號碼,取值:2。 |
push_stream | string | 否 | 推流URL。 |
pull_streams | []object | 否 | 拉流對象,支援多個拉流。詳情請參見下表。 |
sdk_version | string | 否 | SDK版本號碼。 |
jsep.type | string | 是 | SDP類型,取值:offer。 |
jsep.sdp | string | 是 | SDP描述。 |
欄位 | 類型 | 是否必填 | 描述 |
url | string | 是 | 拉流URL,例如: |
amsid | []string | 是 | 拉流音頻msid,直播情境取值 |
vmsid | []string | 是 | 拉流視頻msid,直播情境取值 |
相應樣本
Response:
{
"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 以下省略"
}
}欄位 | 類型 | 是否必需 | 描述 |
code | int | 是 | 返回碼。正確返回200,錯誤碼請參見下表。 |
trace_id | string | 是 | 全域唯一請求標識ID。由CDN產生,請盡量做好儲存,用於對請求進行定位和問題排查。 |
jsep.type | string | 是 | SDP類型,取值:answer。 |
jsep.sdp | string | 是 | 直播CDN回源拉流產生SDP。 |
錯誤碼 | 描述 |
403 | 鑒權失敗。 |
404 | 流不存在。 |
611 | 需要用戶端強制降級到TCP播放。 |
302 | 需要用戶端向新的服務地址發起信令請求。 |
增強SDP
在信令互動中,SDP用來描述媒體資訊。通用的SDP協商是基於RFC 4566展開的,阿里雲RTS在其基礎上擴充出了更多豐富的語義,相容直播行業的特點,支援更多的音視頻封裝和通訊協定,突破了WebRTC僅支援音頻OPUS、不可使用視訊B幀等的窘境,滿足了如今流媒體業界日益擴大的協議族。
支援AAC音頻
RTS支援傳輸任何能在RTMP中傳輸的AAC格式的音頻,包括AAC-LC、HE-AACv1和HE-AACv2。AAC格式詳情請參見ISO IEC 14496-3。
RTS支援以LATM格式進行AAC音頻傳輸。LATM可根據傳輸中的音頻是否內建音頻編碼資訊來決定是帶內(每個音頻都發)或帶外(只發一次)音頻編碼資訊,即由Audio Mux Element中的muxconfigPresent決定AudioSpecificConfig是帶內或帶外傳輸。因此,LATM相對ADTS更靈活,其AudioSpecificConfig如果保持不變,則可以通過SDP會話先傳輸StreamMuxConfig(AudioSpecificConfig)資訊。
在信令互動階段,RTS會解析推流側音頻編碼資訊,並在協商響應中返回對應的資訊。如下所示:
offer SDP | answer SDP | ||
AAC-LC | HE-AACv1 | HE-AACv2 | |
| | | |
| | | |
此處,通過在answer SDP音頻MP4A-LATM的fmtp中添加SBR-enabled=1表示AAC-HE,添加SBR-enabled=1和PS-enabled=1表示HE-AACv2。由於從AAC-LC到HE-AACv2有技術遞進關係,因此在表示fmtp時,遞進地增加SBR、PS的標識來表示不同的AAC格式。此外,在fmtp中添加config=StreamMuxConfig,其由推流AudioSpecificConfig資訊組裝而來,具體地描述了音頻編碼的各種參數資訊,用戶端可以各取所需。

更多資訊,請參見AAC-LC / HE-AACv1 / HE-AACv2 Encoder Parameters。
支援H.265視頻
RTS會解析推流側視頻編碼資訊(H.264、H.265),在answer SDP中根據推流側實際的編碼方式,返回H.264或H.265。
編碼類別型 | offer SDP | answer SDP |
H.265 | | |
支援B幀視頻
在信令互動階段,用戶端可以在offer SDP中增加欄位標識其是否支援解析B幀視頻。例如:在視頻fmtp中增加BFrame-enabled = 1標識以表示支援B幀,此時,RTP timestamp = PTS,sequence number遞增,正常情況下用戶端按照sequence number解碼即可。如果不支援B幀,RTS可以對視頻源流進行轉碼,去掉B幀。
此外,RTS還支援額外返回CTS擴充頭以支援需要精確計算DTS的用戶端(PTS=DTS+CTS),如果offer SDP中帶有a=extmap:{$id} uri:webrtc:rtc:rtp-hdrext:video:CompositionTime,RTS會在每一幀視頻的第一個RTP包上增加extension identifier = {$id}的CTS擴充頭,id由offer SDP來決定。offer SDP片段及拉流抓包樣本如下所示:


RTS給予用戶端充分的表達能力,將決定權下放給使用者,讓其決定是否接受視頻帶B幀,以及是否需要額外的CTS資訊,構建更通用的通訊能力。
MSID相關概念
關於MSID詳細資料,請參見The Msid Mechanism。