RTS (Real-Time Streaming) は、WebRTC (Web Real-Time Communication) シグナリング方式に基づいて実現されます。 RTSは、世界中のAlibaba Cloudポイントオブプレゼンス (POP) とAlibaba Cloudの優れたスケジューリングアルゴリズムを利用して、低レイテンシーのライブストリーミングをサポートしています。 このトピックでは、RTSシグナリングプロトコルの仕様について説明します。 このトピックは、WebRTCの基本的な知識を習得する開発者を対象としています。
シグナリングプロセス
次の図は、シグナリング処理を示しています。
シグナリングプロセス
クライアントは、セッション記述プロトコル (SDP) オファーと共に要求を送信します。
クライアントでRTCPeerConnectionオブジェクトを作成し、オーディオおよびビデオ信号を受信するか送信するかを指定してから、SDPオファーを作成します。
// Specify whether to receive or send audio and video signals. { offerToReceiveVideo: true, offerToReceiveAudio: true }
HTTPS POSTメソッドを使用して、クライアントからApsaraVideo Liveにストリームプルリクエストを送信します。 リクエスト本文はJSON文字列です。 リクエストパラメーターの詳細については、このトピックの「RTSシグナリングプロトコルの定義」をご参照ください。
説明version
パラメータは、RTSシグナリングプロトコルのバージョンを指定します。 値を 2 に設定します。sdk_version
パラメーターは、RTS sdkのバージョンを指定します。 必要に応じてパラメーターを設定できます。
POSTメソッドを使用して、シグナリングURLに基づいて構築されたリクエストを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の内容は、プロトコルヘッダを除いて、ソースURLの内容と基本的に同じである。 次のURLに例を示します。
シグナリングURL:
https://domain/app/streamname?auth=xxx
ソースURL:
artc://domain/app/streamname?auth=xxx
サーバは、SDP回答とともに応答を返します。
ApsaraVideo Liveのサーバーがリクエストを検証した後、サーバーはSDP応答を生成し、ライブストリーミングノードに関する情報を含む応答をクライアントに返します。 応答パラメーターの詳細については、このトピックの「RTSシグナリングプロトコルの定義」をご参照ください。
クライアントは、ICE (Interactive Connectivity Establishment) を開始します。
クライアントがSDP回答を含む応答を受信した後、RTCPeerConnectionオブジェクトでセッション記述を指定します。
peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep));
RTCPeerConnectionオブジェクトを使用して、ICEおよびデータグラムトランスポート層セキュリティ (DTLS) 暗号化を開始します。 シグナリングチャネルが確立されると、クライアントはApsaraVideo Liveからストリームをプルできます。 このようにして、WebRTCの標準に基づいてストリームのプルと再生を実装できます。
クライアントが切断を開始します。
クライアントは、ストリームの取り込みまたは再生を停止するために切断を開始するDTLS警告メッセージを送信します。
HTML5プレーヤーのサンプルコード
// 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シグナリングプロトコルの定义
RTSシグナリングプロトコルは、HTTPSに基づいて短期間の接続を確立します。 プロトコルはJSON形式のメッセージを使用します。 このセクションでは、RTSシグナリングプロトコルに基づく要求、応答、およびエラーコードについて説明します。
サンプルリクエスト
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 Omitted content"
}
}
パラメーター | データ型 | 必須 | 説明 |
モード | String | 課金されます | ストリームのモード。 この例では、パラメーターをliveに設定します。 |
version | int | 課金されます | プロトコルのバージョン。 この例では、パラメーターを2に設定します。 |
push_stream | String | 課金されません | 取り込みURL。 |
pull_streams | [] オブジェクト | 課金されません | プルするストリーム。The stream that you want to pull. 一度に複数のストリームをプルできます。 pull_streamパラメーターの属性の詳細については、次の表をご参照ください。 |
sdk_version | String | 課金されません | SDKのバージョン。 |
jsep. 型 | String | 課金されます | SDPメッセージのタイプ。 この例では、パラメーターをofferに設定します。 |
jsep.sdp | String | 課金されます | SDPメッセージの説明。 |
表 1. pull_streamパラメーターの属性
属性 | データ型 | 必須 | 説明 |
url | String | 課金されます |
|
amsid | [] 文字列 | 課金されます | プルするオーディオストリームのメディアストリームID (MSID) 。 この例では、パラメーターを |
vmsid | [] 文字列 | 課金されます | プルするビデオストリームの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 Omitted content"
}
}
パラメーター | データ型 | 必須 | 説明 |
code | int | 課金されます | HTTP ステータスコード リクエストが成功した場合、コード200が返されます。 ステータスコードの詳細については、「ステータスコード」セクションを参照してください。 |
trace_id | String | 課金されます | リクエストのグローバル一意ID (GUID) 。 GUIDはAlibaba Cloud CDNによって生成され、問題のトラブルシューティングに使用できます。 GUIDを正しく保持します。 |
jsep. 型 | String | 課金されます | SDPメッセージのタイプ。 この例では、値の答えが返されます。 |
jsep.sdp | String | 課金されます | POPがオリジンからストリームをプルするときに生成されるSDPメッセージの説明。 |
表 2. ステータスコード
ステータスコード | 説明 |
403 | 認証が失敗したことを示します。 |
404 | ストリームが存在しないことを示します。 |
611 | クライアントがTCP経由でストリームを再生する必要があることを示します。 |
302 | クライアントが新しいアドレスに要求を送信する必要があることを示します。 |
SDPネゴシエーションの強化
メッセージは、シグナリング中にSDPフォーマットで交換される。 SDPネゴシエーションは、一般に、RFC 4566に基づく。 RTSは、ネゴシエーションをライブストリーミング業界の特性と互換性のあるものにするために、より多くのセマンティクスを拡張します。 RTSは、ビデオとオーディオのより多くのコンテナ形式と、より多くの通信プロトコルをサポートします。 このように、RTSは、WebRTCがオーディオのOpus形式のみをサポートし、Bフレームをサポートしないという問題を解決します。 RTSは、増加するストリーミングプロトコルのニーズを満たします。
AACオーディオ対応
RTSは、RTMPを介してさまざまなAAC形式でオーディオを送信できます。 AACフォーマットは、AAC-LC、HE-AACv1、およびHE-AACv2を含みます。 AACフォーマットの詳細については、「ISO IEC 14496-3」をご参照ください。
RTSは、低オーバーヘッドMPEG-4オーディオトランスポート多重 (LATM) コンテナフォーマットを使用して、AACフォーマットでオーディオを送信できます。 LATMは、オーディオが符号化情報を含むかどうかに基づいて、オーディオに関する符号化情報が帯域内モードで送信されるか帯域外モードで送信されるかを決定します。 帯域内伝送は、各オーディオフレームの符号化情報を送信します。 帯域外伝送は、符号化情報を一度だけ送信します。 AudioMuxElement配列内のmuxconfigPresentパラメータは、AudioSpecificConfig内の情報が帯域内モードで送信されるか帯域外モードで送信されるかを指定します。 したがって、LATMは、オーディオデータ転送ストリーム (ADTS) よりも柔軟です。 AudioSpecificConfig内の情報が変更されないままである場合、StreamMuxConfig内の情報は、SDPメッセージで最初に送信され得ます。
シグナリング中、RTSはオーディオストリームの取り込み中にエンコード情報を解析し、次のコードに示すように、ネゴシエーション応答で解析された情報を返します。
SDPオファー | SDP回答 | ||
AAC-LC | HE-AACv1 | HE-AACv2 | |
|
|
|
|
|
|
|
MP4A-LATMのfmtp属性にSBR-enabled=1
が追加された場合、AACフォーマットがAAC-HEされます。 SBR-enabled=1
とPS-enabled=1
が追加された場合、AACフォーマットがHE-AACv2されます。 AAC形式は、AAC-LCからHE-AACv2に進化しています。 したがって、fmtp属性においてSBRおよびPSフィールドを使用して、AACフォーマットを示すことができます。 さらに、fmtp属性にconfig=StreamMuxConfig
を追加できます。 StreamMuxConfigは、取り込まれたストリームのAudioSpecificConfigから取得され、符号化情報の詳細に関連するパラメータを含みます。 クライアントは必要に応じて詳細を取得できます。
詳細については、「AAC-LC / HE-AACv1 / HE-AACv2エンコーダパラメータ」をご参照ください。
H.265ビデオをサポート
RTSは、ストリーム取り込み中にH.264またはH.265形式のビデオのエンコード情報を解析し、SDP回答でH.264
またはH.265
形式のビデオに関する情報を返します。
エンコード形式 | SDPオファー | SDP回答 |
H.265 |
|
|
Bフレームを含むビデオがサポート
シグナリング中、クライアントは、Bフレームを含むビデオを復号するかどうかを指定するために、SDPオファーにフィールドを追加することができます。 たとえば、クライアントがfmtp属性にBFrame-enabled = 1
を追加した場合、クライアントはBフレームを含むビデオをデコードできます。 この場合、RTP timestamp = PTS
を追加することができ、これは、クライアントが、増加するシーケンス番号に基づいて各フレームを復号することを意味します。 Bフレームを含むビデオがサポートされていない場合、RTSはソースストリームをトランスコードしてBフレームを削除できます。
さらに、サーバは、構成タイムスタンプ (CTS) を返すことができます。 これにより、クライアントは、以下の式に基づいて復号タイムスタンプ (DTS) を計算することができます。 SDPオファーがa=extmap:{$id} uri:webrtc:rtp-hdrext:video:CompositionTime
を含む場合、RTSはextension identifier = {$id}
を各ビデオフレームの最初のリアルタイムトランスポートプロトコル (RTP) パケットに追加します。 id
変数の値は、クライアントによって送信されるSDPオファーによって決定されます。 次の図は、ストリームプル中のSDPオファーとパケットキャプチャの部分的なコンテンツを示しています。
RTSにより、クライアントは、Bフレームを含むビデオをデコードするかどうか、およびCTS情報を返すかどうかを判断できます。 これは、通信における一般的な能力を保証します。
MSIDメカニズム
MSIDの詳細については、「Msidメカニズム」をご参照ください。