WebRTC 即Web Real-Time Communication
(網頁實時通訊)的縮寫,是一個支持網頁瀏覽器之間進行實時數據傳輸(包括音頻、視頻、數據流)的技術。通過多年的發展與改進,日臻成熟,做爲瀏覽器網頁端的通訊技術,WebRTC與H5巧妙結合,使得網頁端的音視頻通訊變的簡單易行。html
關於WebRTC首先明確一些內容:git
WebRTC利用瀏覽器中的JavaScript API和HTML5
WebRTC客戶端之間能夠進行點對點的媒體和數據傳輸
webrtc使用sdp協議做爲媒體協商協議
webrtc使用ice做爲nat穿越的手段
複製代碼
getUserMida
:經過getUserMida的API可以經過設備的攝像頭和話筒得到視頻、音頻的同步流;
RTCPeerConnection
:RTCPeerConnection(免費下載《WebRTC 1.0: 瀏覽器間實時通信》中文版)是WebRTC用於構建點對點之間穩定、高效的流傳輸的媒體終端;
RTCDataChannel
:RTCDataChannel(免費下載《WebRTC 1.0: 瀏覽器間實時通信》中文版)使得瀏覽器之間(點對點)創建一個高吞吐量、低延時的信道,用於傳輸任意數據;
RTCPeerConnection
會話getUserMida
接口獲取本地mic、camera上音頻流和視頻流RTCPeerConnection
實例getUserMida
接口獲取的本地音頻流和視頻流,展現到html頁面上,而且添加到RTCPeerConnection
實例中RTCPeerConnection
實例獲取本端的sdp信息(本地媒體描述信息)RTCPeerConnection
實例,獲取本地媒體通道地址,而後經過信令協議發送到對端RTCPeerConnection
實例中,這樣就完成了媒體協商RTCPeerConnection
實例中獲取對端的媒體流,能夠展現到html頁面上通過上面的步驟,雙方就能進行點對點視頻通話了,後續的nat穿透、dtls協商加密祕鑰、srtp加密媒體、媒體編解碼,媒體收發都由瀏覽器自動完成。github
上面說明獲取攝像頭的媒體流是經過getUserMida
接口,而獲取屏幕共享則是經過其餘的方式;web
getDisplayMedia
接口(chrome 72版本開始支持)使用方式同getUserMedia
接口一致,代碼以下:算法
if (navigator.getDisplayMedia) {
return navigator.getDisplayMedia({video: true});
} else if (navigator.mediaDevices.getDisplayMedia) {
return navigator.mediaDevices.getDisplayMedia({video: true});
}
複製代碼
插件代碼以下:chrome
chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
const sources = message.sources;
const tab = sender.tab;
chrome.desktopCapture.chooseDesktopMedia(sources, tab, streamId => {
if (!streamId) {
sendResponse({
type: 'error',
message: 'Failed to get stream ID'
});
} else {
sendResponse({
type: 'success',
streamId: streamId
});
}
});
return true;
}
);
chrome.runtime.onInstalled.addListener(function(){
chrome.declarativeContent.onPageChanged.removeRules(undefined, function(){
chrome.declarativeContent.onPageChanged.addRules([
{
conditions: [
new chrome.declarativeContent.PageStateMatcher({ pageUrl: { urlContains: 'app.netease.im'}})
],
actions: [new chrome.declarativeContent.ShowPageAction()]
}
]);
});
});
複製代碼
getUserMedia
接口的使用以下:小程序
chrome.runtime.sendMessage(EXTENSION_ID, { sources: ['window', 'screen', 'tab'] }, {}, response => {
if (response && response.type === 'success') {
const constraint = {
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: response.streamId
}
}
}
return navigator.mediaDevices.getUserMedia(constraint)(constraint)
.then(stream => {
console.log('獲取到演示流:', stream.id)
})
}
})
複製代碼
對WebRTC而言,Unified Plan、Plan B、Plan A是SDP中多路媒體流的協商方式,在72版本中Chrome替換了Plan B,默認使用Unified Plan。微信小程序
https://webrtc.github.io/samples/src/content/peerconnection/pc1/, { iceServers: [], iceTransportPolicy: all, bundlePolicy: balanced, rtcpMuxPolicy: require, iceCandidatePoolSize: 0, sdpSemantics: "unified-plan" },
複製代碼
...
a=group:BUNDLE audio
a=msid-semantic: WMS stream-id-2 stream-id-1
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
...
a=mid:audio
...
a=rtpmap:103 ISAC/16000
...
a=ssrc:10 cname:cname
a=ssrc:10 msid:stream-id-1 track-id-1
a=ssrc:10 mslabel:stream-id-1
a=ssrc:10 label:track-id-1
a=ssrc:11 cname:cname
a=ssrc:11 msid:stream-id-2 track-id-2
a=ssrc:11 mslabel:stream-id-2
a=ssrc:11 label:track-id-2
複製代碼
...
a=group:BUNDLE 0 1
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
...
a=mid:0
...
a=sendrecv
a=msid:- <track-id-1>
...
a=rtpmap:103 ISAC/16000
...
a=ssrc:10 cname:cname
a=ssrc:10 msid: track-id-1
a=ssrc:10 mslabel:
a=ssrc:10 label:track-id-1
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
...
a=mid:1
...
a=sendrecv
a=msid:- track-id-2
...
a=rtpmap:103 ISAC/16000
...
a=ssrc:11 cname:cname
a=ssrc:11 msid: track-id-2
a=ssrc:11 mslabel:
a=ssrc:11 label:track-id-2
複製代碼
1、點對點視頻通話業務api
一、WebRTC產品中沒有處理過sdp中的msid屬性瀏覽器
不用適配,這次的更新對你的產品沒有影響
二、WebRTC產品中有處理sdp中的msid屬性
須要適配,凡是針對msid的判斷和修改都須要廢棄,從新處理
2、多流業務,使用了simulcast
一、WebRTC產品中沒有處理過sdp中的msid屬性
須要適配,調整接口使用,調整sdp的解析處理,增長多m行的處理
二、WebRTC產品中有處理sdp中的msid屬性
須要適配,凡是針對msid的判斷和修改都須要廢棄,從新處理,調整接口使用,調整sdp的解析處理,增長多m行的處理
Chrome瀏覽器查看WebRTC狀態方法:
chrome:chrome://webrtc-internals
瀏覽器中輸入chrome://webrtc-internals,界面顯示以下:
WebRTC狀態圖說明: 最上面一排依次是:getUserMedia API、二個peerconnection API
Caller origin: https://webrtc.github.io
Caller process id: 15364
Audio Constraints
Video Constraints
{width: {min: 300, max: 640}, height: {min: 200, max: 480}}
複製代碼
PeerConnection狀態圖說明:
本文是WebRTC工做組最新一次會議後的候選推薦標準,基於WebIDL定義了一組ECMAScript API,容許在實現了相關實時協議的瀏覽器或設備之間發送和接收媒體內容。同時也是對WebRTC的一個全面介紹,包括WebRTC中的各個術語,獨有的概念,API的使用規範,詳細的算法流程和一些注意點,而且對涉及的數據結構及其屬性進行了剖析。在特定的使用場景下,草案的做者們還附上了示例代碼。
• 對於WebRTC初學者,本文檔能夠做爲學習教程,幫助你快速對WebRTC有全面且詳細的瞭解,學習相關API的使用,其附帶的示例代碼也是很好的學習資料;
• 對於WebRTC資深開發者,本文檔能夠做爲開發中的使用手冊,根據所提供的函數調用鏈或是算法流程進行開發或bug定位;
• 對於高階玩家,也可經過閱讀本文檔對WebRTC工做組反饋改進意見。
限時免費下載,WebRTC開發者必備,機不可失哦~