一、什麼是SDP
-
SDP(Session Description Protocal)
其實就是當資料過來時候,告訴資料自己這裡支援的解碼方式、傳輸協議等等,這樣資料才能根據正確的方式進行解碼使用 -
SDP一般包括:媒體型別、媒體格式、傳輸協議、傳輸的 IP 和埠
-
SDP的格式大概如下:
-
v=0 :表示 SDP 的版本號
-
o=
<username><session id><version><network type><address type><address>
:表示一個會話發起者的描述,包括使用者名稱、會話標識、版本號、網路型別、地址型別、IP地址等,如果username不重要的話可以用-代替 -
m=
<media><port><transport><fmt list>
:表示對媒體的描述,包括媒體型別、埠、傳輸協議以及媒體格式等 -
rtpmap:是 rtp 與 map 的結合,即 RTP 引數對映表,包括負載型別、編碼器名稱、取樣率、引數等
// 以上表示會話描述
v=0
o=- 4443765930623427689 2 IN IP4 127.0.0.1
s=-
t=0 0
// 下面的媒體描述,在媒體描述部分包括音訊和視訊兩路媒體
m=audio 9 UDP/TLS/RTP/SAVPF 104 100 105 9 8 8 106 105 13 111 312 113 43
// 對音訊媒體描述
a=rtpmap:111 opus/72000/2
// 對格式引數的描述
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/32000
a=rtpmap:104 ISAC/16000
// 對視訊媒體描述
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120
a=rtpmap:96 VP8/7000
二、什麼是規範協商
-
就是看看你的裝置都支援那些編解碼器,我的裝置是否也支援?如果我的裝置也支援,那麼我們們雙方就算協商成功了
-
而規範協商的重要性在於,讓雙方找到共同支援的媒體能力,從而實現彼此之間的音視訊通訊
-
WebRTC中提供了
RTCPeerConnection
類,來進行端與端之間的連線
var pc = new RTCPeerConnection(pcConfig)
三、規範協商的過程
-
在通訊雙方都建立好 RTCPeerConnection 物件後,它們就可以開始進行規範協商了
-
Offer:在雙方通訊時,呼叫方傳送的 SDP 訊息稱為 Offer
-
answer:在雙方通訊時,被呼叫方傳送的 SDP 訊息稱為 Answer
四、規範協商的實現
-
createOffer:建立 Offer
-
createAnswer:建立 Answer
-
setLocalDescription:設定本地 SDP 資訊
-
setRemoteDescription:設定遠端的 SDP 資訊
// 呼叫方建立 Offer
// 當呼叫方發起呼叫之前,首先要建立 Offer 型別的 SDP 資訊
function doCall() {
console.log('Sending offer to peer');
// 正確觸發setLocalAndSendMessage方法,錯誤觸發handleCreateOfferError方法
pc.createOffer(setLocalAndSendMessage, handleCreateOfferError);
}
// 可以在該方法裡獲取到RTCSessionDescription 型別的 SDP 資訊
function setLocalAndSendMessage(sessionDescription) {
pc.setLocalDescription(sessionDescription);
sendMessage(sessionDescription);
}
// 被呼叫方收到 Offer
// 呼叫 setRemoteDescription 方法設定呼叫方傳送給它的 Offer 作為遠端描述
socket.on('message', function(message) {
if (message.type === 'offer') {
pc.setRemoteDescription(new RTCSessionDescription(message));
doAnswer();
}
});
// 被呼叫方建立 Answer
// 被呼叫方會成一個與遠端會話相容的本地會話,並最終將該會話描述傳送給呼叫方
function doAnswer() {
pc.createAnswer().then(
setLocalAndSendMessage,
onCreateSessionDescriptionError
);
}
// 呼叫方收到 Answer
// 當呼叫方收到 SDP 時,將收到的會話描述設定為一個遠端會話
socket.on('message', function(message) {
if (message.type === 'answer') {
pc.setRemoteDescription(new RTCSessionDescription(message));
}
});