WebRTC (Web Real-Time Communications) 是一項實時通訊技術,在 2011 年由 Google 提出,經(jīng)過 10 年的發(fā)展,W3C 于 2021 年正式發(fā)布 WebRTC 1.0 標準 。

文章插圖
WebRTC 標準概括介紹了兩種不同的技術:媒體捕獲設備和點對點連接(P2P,Peer-to-Peer),可讓用戶無需安裝任何插件或第三方軟件的情況下,實現(xiàn)共享桌面、文件傳輸、視頻直播等功能 。
下圖是官方給出的一張 WebRTC 整體架構設計圖:

文章插圖
- 紫色部分是前端開發(fā)所使用的 API 。
- 藍色實線部分是各大瀏覽器廠商所使用的 API 。
- 藍色虛線部分包含可自定義的 3 塊:音頻引擎、視頻引擎和網(wǎng)絡傳輸 。
本文的源碼已上傳至 Github,有需要的可以隨意下載 。
一、自拍自拍是指通過攝像頭拍照生成圖片,先看下 HTML 結構,其實就 4 個元素 。
<video id="video"></video><button id="btn">拍照</button><canvas id="canvas" width="300" height="300"></canvas><img id="img" alt="照片"/>1)getUserMedia()
然后在腳本中聲明各個元素,通過 navigator.mediaDevices.getUserMedia() 方法獲取媒體流 。
const video = document.getElementById('video');const canvas = document.getElementById('canvas');const btn = document.getElementById('btn');const img = document.getElementById('img');const size = 300;/** * 獲取媒體流 */navigator.mediaDevices.getUserMedia({video: {width: size,height: size,},audio: false}).then((stream) => {video.srcObject = stream;video.play();});getUserMedia() 的參數(shù)是一個包含了video 和 audio 兩個成員的 MediaStreamConstraints 對象,上面代碼將攝像頭的分辨率限制為 300 x 300 。
then() 中的 stream 參數(shù)是一個 MediaStream 媒體流,一個流相當于容器,可以包含幾條軌道,例如視頻和音頻軌道,每條軌道都是獨立的 。
video 元素中的 src 和 srcObject 是一對互斥的屬性,后者可關聯(lián)媒體源,根據(jù)規(guī)范也可以是 Blob 或者 File 等類型的數(shù)據(jù) 。
接著為按鈕綁定點擊事件,并且在點擊時從流中捕獲幀,畫到 Canvas 內(nèi),再導出賦給 img 元素 。
/** * 點擊拍照 */btn.addEventListener('click', (e) => {const context = canvas.getContext('2d');// 從流中捕獲幀context.drawImage(video, 0, 0, size, size);// 將幀導出為圖片const data = https://www.huyubaike.com/biancheng/canvas.toDataURL('image/png');img.setAttribute('src', data);}, false);在下圖中,左邊是 video 元素,打開攝像頭后就會有畫面,在點擊拍照按鈕后,右邊顯示捕獲的幀 。

文章插圖
2)enumerateDevices()
MediaDevices 提供了訪問媒體輸入和輸出的設備,例如攝像頭、麥克風等,得到硬件資源的媒體數(shù)據(jù) 。
mediaDevices.enumerateDevices() 會得到一個描述設備的 MediaDeviceInfo 的數(shù)組 。
其中 groupId 用于標識多個設備屬于同一個物理設備,例如一個顯示器內(nèi)置了攝像頭和麥克風 。
navigator.mediaDevices.enumerateDevices().then((devices) => {devices.forEach((device) => {console.log(`${device.kind}: ${device.label} id = ${device.deviceId}`);});})3)devicechange
當媒體設備(例如麥克風、攝像頭等)連接到系統(tǒng)或從系統(tǒng)中移除時,devicechange 事件就會被發(fā)送給設備實例 。
navigator.mediaDevices.ondevicechange = (event) => { };event 參數(shù)沒有附加任何特殊的屬性 。
二、共享桌面Windows 系統(tǒng)采用的共享桌面協(xié)議是 RDP(Remote Desktop Protocal),另一種可在不同操作系統(tǒng)共享桌面的協(xié)議是 VNC(Virtual Network Console) 。
經(jīng)驗總結擴展閱讀
- 記一次 .NET 某娛樂聊天流平臺 CPU 爆高分析
- 1 人人都懂的HTML基礎知識-HTML教程
- 蘇有朋版倚天屠龍記光明頂大戰(zhàn)是第幾集?
- 怎么開保險柜新買的保險柜打不開了,忘記怎么開了
- 4 .NET 6學習筆記——如何在.NET 6的Desktop App中使用Windows Runtime API
- GitHub Pages 和 Jekyll 筆記
- 中鐵十六局個人門戶網(wǎng)忘記密碼咋辦 中鐵十六局門戶網(wǎng)站
- 大數(shù)據(jù)請記住我是什么梗
- 世界紀錄與奧運會記錄的區(qū)別
- [Oracle]復習筆記-SQL部分內(nèi)容
