6┃音視訊直播系統之 WebRTC 核心驅動SDP規範協商

autofelix發表於2022-05-15

一、什麼是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));
 	}
});

 

相關文章