精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

快速入門 WebRTC:屏幕和攝像頭的錄制、回放、下載

開發 前端
今天我們就來實現下采集的部分,來快速入下門,直觀感受下 WebRTC 能做什么吧。我們會實現屏幕的錄制、攝像頭的錄制,并且能夠回放錄制的內容,還支持下載。

[[441095]]

不知你是否用過 web 版的視頻面試,或者 web 版在線會議,它們都支持分享屏幕、也能開啟攝像頭。這些都是瀏覽器上實現的,作為前端開發,是否好奇過這些功能的實現原理呢?

瀏覽器上的音視頻通信相關的能力叫做 WebRTC(real time communication),是隨著網速越來越快、音視頻需求越來越多,而被瀏覽器所實現的音視頻的標準 API。

音視頻通信的流程有五步:采集、編碼、通信、解碼、渲染。

這五步比較好理解,但是每一步都有挺多內容的。

今天我們就來實現下采集的部分,來快速入下門,直觀感受下 WebRTC 能做什么吧。

我們會實現屏幕的錄制、攝像頭的錄制,并且能夠回放錄制的內容,還支持下載。

那我們開始吧。

思路分析

瀏覽器提供了 navigator.mediaDevices.getDisplayMedia 和 navigator.mediaDevices.getUserMedia 的 api,分別可以用來獲取屏幕的流、麥克風和攝像頭的流。

從名字就可以看出來 getDisplayMedia 獲取的是屏幕的流,getUserMedia 獲取的是和用戶相關的,也就是麥克風、攝像頭這些的流。

獲取流之后設置到 video 的 srcObject 屬性上就可以實現播放。

如果想要錄制視頻,需要用 MediaRecorder 的 api,它可以監聽流中的數據,我們可以把獲取到的數據保存到數組中。然后回放的時候設置到另一個視頻的 srcObject 屬性就可以了。

下載也是基于 MediaRecorder 錄制的數據,轉成 blob 后通過 a 標簽觸發下載。

大概理清了思路,我們來寫下代碼。

代碼實現

我們在頁面放兩個 video 標簽,一個用于實時的看錄制的視頻,一個用于回放。

然后放幾個按鈕。

  1. <selection> 
  2.     <video autoplay id = "player"></video> 
  3.     <video id = "recordPlayer"></video> 
  4. </selection> 
  5. <section>  
  6.     <button id = "startScreen">開啟錄屏</button> 
  7.     <button id = "startCamera">開啟攝像頭</button> 
  8.     <button id = "stop">結束</button> 
  9.     <button id = "reply">回放</button> 
  10.     <button id = "download">下載</button> 
  11. </selection> 

 

“開始錄屏” 和 “開啟攝像頭” 按鈕點擊的時候都開啟錄制,但是方式不同。

  1. startScreenBtn.addEventListener('click', () => { 
  2.     record('screen'); 
  3. }); 
  4. startCameraBtn.addEventListener('click', () => { 
  5.     record('camera'); 
  6. }); 

一個是用 getUserMedia 的 api 來獲取麥克風、攝像頭數據,一個是用 getDisplayMedia 的 api 獲取屏幕數據。

  1. async function record(recordType) { 
  2.     const getMediaMethod = recordType === 'screen' ? 'getDisplayMedia' : 'getUserMedia'
  3.     const stream = await navigator.mediaDevices[getMediaMethod]({ 
  4.         video: { 
  5.             width: 500, 
  6.             height: 300, 
  7.             frameRate: 20 
  8.         } 
  9.     }); 
  10.  
  11.     player.srcObject = stream; 

指定下寬高和幀率等參數,把返回的流設置到 video 的 srcObject 屬性上,就可以實時看到對應的音視頻。

然后,還要做錄制,需要用 MediaRecorder 的 api,傳入 stream,然后調用 start 方法,開啟錄制。

  1. let blobs = [], mediaRecorder; 
  2.  
  3. mediaRecorder = new MediaRecorder(stream, { 
  4.     mimeType: 'video/webm' 
  5. }); 
  6. mediaRecorder.ondataavailable = (e) => { 
  7.     blobs.push(e.data); 
  8. }; 
  9. mediaRecorder.start(100); 

start 的參數是分割的大小,傳入 100 代表每 100ms 保存一次數據。

監聽 dataavailable 事件,在其中把獲取到的數據保存到 blobs 數組中。

之后根據 blobs 數組生成 blob,就可以分別做回放和下載了:

回放:

  1. replyBtn.addEventListener('click', () => { 
  2.     const blob = new Blob(blobs, {type : 'video/webm'}); 
  3.     recordPlayer.src = URL.createObjectURL(blob); 
  4.     recordPlayer.play(); 
  5. }); 

blob 要經過 URL.createObjectURL 的處理,才能作為 object url 來被播放。

下載:

  1. download.addEventListener('click', () => { 
  2.     var blob = new Blob(blobs, {type: 'video/webm'}); 
  3.     var url = URL.createObjectURL(blob); 
  4.  
  5.     var a = document.createElement('a'); 
  6.     a.href = url; 
  7.     a.style.display = 'none'
  8.     a.download = 'record.webm'
  9.     a.click(); 
  10. }); 

生成一個隱藏的 a 標簽,設置 download 屬性就可以支持下載。然后觸發 click 事件。

目前為止,我們已經實現了麥克風、攝像頭、屏幕的錄制,支持了回放和下載。

這里也貼一份:

  1. <html> 
  2. <head> 
  3.         <title>錄屏并下載</title> 
  4. </head> 
  5. <body> 
  6.         <selection> 
  7.                 <video autoplay id = "player"></video> 
  8.                 <video id = "recordPlayer"></video> 
  9.         </selection> 
  10. <section>  
  11.     <button id = "startScreen">開啟錄屏</button> 
  12.     <button id = "startCamera">開啟攝像頭</button> 
  13.     <button id = "stop">結束</button> 
  14.     <button id = "reply">回放</button> 
  15.     <button id = "download">下載</button> 
  16.         </selection> 
  17.  
  18. <script> 
  19.     const player = document.querySelector('#player'); 
  20.     const recordPlayer = document.querySelector('#recordPlayer'); 
  21.     let blobs = [], mediaRecorder; 
  22.  
  23.     async function record(recordType) { 
  24.         const getMediaMethod = recordType === 'screen' ? 'getDisplayMedia' : 'getUserMedia'
  25.         const stream = await navigator.mediaDevices[getMediaMethod]({ 
  26.             video: { 
  27.                 width: 500, 
  28.                 height: 300, 
  29.                 frameRate: 20 
  30.             } 
  31.         }); 
  32.         player.srcObject = stream; 
  33.  
  34.         mediaRecorder = new MediaRecorder(stream, { 
  35.             mimeType: 'video/webm' 
  36.         }); 
  37.         mediaRecorder.ondataavailable = (e) => { 
  38.             blobs.push(e.data); 
  39.         }; 
  40.         mediaRecorder.start(100); 
  41.     } 
  42.  
  43.     const downloadBtn = document.querySelector('#download'); 
  44.     const startScreenBtn = document.querySelector('#startScreen'); 
  45.     const startCameraBtn = document.querySelector('#startCamera'); 
  46.     const stopBtn = document.querySelector('#stop'); 
  47.     const replyBtn = document.querySelector('#reply'); 
  48.  
  49.     startScreenBtn.addEventListener('click', () => { 
  50.         record('screen'); 
  51.     }); 
  52.     startCameraBtn.addEventListener('click', () => { 
  53.         record('camera'); 
  54.     }); 
  55.  
  56.     stopBtn.addEventListener('click', () => { 
  57.         mediaRecorder && mediaRecorder.stop(); 
  58.     }); 
  59.  
  60.     replyBtn.addEventListener('click', () => { 
  61.         const blob = new Blob(blobs, {type : 'video/webm'}); 
  62.         recordPlayer.src = URL.createObjectURL(blob); 
  63.         recordPlayer.play(); 
  64.     }); 
  65.  
  66.     download.addEventListener('click', () => { 
  67.         var blob = new Blob(blobs, {type: 'video/webm'}); 
  68.         var url = URL.createObjectURL(blob); 
  69.  
  70.         var a = document.createElement('a'); 
  71.         a.href = url; 
  72.         a.style.display = 'none'
  73.         a.download = 'record.webm'
  74.         a.click(); 
  75.     }); 
  76. </script> 
  77. </body> 
  78. </html> 

總結

音視頻通信分為 采集、編碼、通信、解碼、渲染 這五步,瀏覽器的音視頻通信相關的 API 叫做 WebRTC。

我們實現了下采集的部分來入門了下 WebRTC,還支持了回放和下載。

涉及到的 api 有 3 個:

  • navigator.mediaDevices.getUserMedia:獲取麥克風、攝像頭的流
  • navigator.mediaDevices.getDisplayMedia:獲取屏幕的流
  • MediaRecorder:監聽流的變化,實現錄制

我們分別用前兩個 api 獲取到了屏幕、麥克風、攝像頭的流,然后用 MediaRecorder 做了錄制,把數據保存到數組中,之后生成了 Blob。

video 可以設置 srcObject 屬性為一個流,這樣能直接播放,如果設置 Blob 的話需要用 URL.createObjectURL 處理下。

下載的實現是通過 a 標簽指向 Blob 對象的 object url,通過 download 屬性指定下載行為,然后手動觸發 click 來下載。

我們學會了如何用 WebRTC 來采集數據,這是音視頻通信的數據來源,之后還要實現編解碼和通信才能是完整 RTC 流程,這些后續再深入。

我們直觀的感受了下 WebRTC 能做什么,是不是感覺這個領域也挺有趣的呢?

 

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2009-10-22 09:00:10

Windows 7攝像工具

2021-03-11 10:21:55

特斯拉黑客網絡攻擊

2013-03-21 09:56:09

2017-06-20 11:45:52

2011-04-25 09:16:10

Windows 8

2012-06-23 20:13:44

HTML5

2024-11-29 16:51:18

2023-05-26 16:42:28

2022-05-12 09:25:19

Python播放視頻攝像頭

2023-01-13 08:00:00

人工智能攝像頭人臉識別

2009-08-21 17:24:18

C#控制攝像頭

2009-06-17 11:52:01

Linux

2011-09-08 13:53:20

Linux攝像頭

2025-07-15 10:28:45

2025-01-13 00:00:30

WinForm應用開發

2022-04-15 11:30:59

代碼,Python保存視頻

2014-05-12 10:57:41

TermRecord終端會話

2019-05-20 09:42:04

2011-09-13 15:51:11

PhoneGap AP

2020-06-04 10:59:10

JavaScript開發技術
點贊
收藏

51CTO技術棧公眾號

超碰91在线观看| 大肉大捧一进一出好爽动态图| 综合久久中文字幕| 日韩中字在线| 91麻豆精品国产91久久久久| 六月天综合网| 亚洲另类黄色| 日韩一区二区三区精品视频| 日韩欧美亚洲在线| 国产又色又爽又黄的| 牲欧美videos精品| 天涯成人国产亚洲精品一区av| 久久精品日产第一区二区三区乱码| 国产手机在线视频| 久久99精品国产自在现线| 一本色道亚洲精品aⅴ| 日韩av免费电影| 国产精品熟女久久久久久| 欧美va天堂| 亚洲精品少妇网址| 午夜精品免费看| 久草在线资源站资源站| 91丨porny丨蝌蚪视频| 国产精品视频一| 狠狠色综合色区| 无码 制服 丝袜 国产 另类| 青草久久伊人| 国产一区二区三区在线观看免费| 欧美激情二区三区| 性感美女一区二区三区| 在线免费日韩片| 国产精品久久久久精k8| 91九色露脸| 中文字幕xxxx| 狠狠噜噜久久| 日韩有码在线观看| 91插插插插插插插插| 久久免费电影| 最新热久久免费视频| 国产在线一区二区三区四区| 一区二区三区日| 99视频在线精品国自产拍免费观看| 一本色道久久88亚洲综合88| 亚洲图片 自拍偷拍| 东京一区二区| 亚洲国产成人91porn| 亚洲高清不卡一区| 欧美一区二区视频| 成人三级伦理片| 成人做爰www免费看视频网站| 秋霞精品一区二区三区| 欧美1级日本1级| 日韩在线视频网站| 亚洲成人日韩在线| 免费一级欧美在线大片 | 精品少妇人妻av一区二区三区| 欧美电影h版| 国产精品美女一区二区三区| 欧美成ee人免费视频| 日韩在线视频免费| 国产一区二区福利| 国产三级精品网站| 免费在线不卡av| 天堂中文字幕av| 久久久久久久久久久妇女| 亚洲性av网站| 国产精品毛片一区二区| 麻豆成人入口| 精品日韩欧美一区二区| 国产理论在线播放| 另类中文字幕国产精品| 一本一本久久a久久精品综合麻豆| 欧美激情视频免费看| 午夜视频成人| 国产精品家庭影院| 日本三级中国三级99人妇网站 | 欧美一级欧美一级在线播放| 国自产拍偷拍精品啪啪一区二区| 日本伦理一区二区| 亚洲综合色自拍一区| 亚洲av首页在线| 成人a在线视频免费观看| 亚洲欧洲www| 亚洲高清在线观看一区| av资源在线观看免费高清| 丁香婷婷深情五月亚洲| 成人黄视频免费| 亚洲第一成年人网站| eeuss国产一区二区三区| 成人高清在线观看| 香蕉视频免费看| 久久嫩草精品久久久精品一| 日韩久久久久久久| 国产在线中文字幕| 国产精品久久精品日日| 精品嫩模一区二区三区| 丁香花在线影院| 亚洲美女偷拍久久| 黄色一级片国产| 涩涩av在线| 欧美私人免费视频| 久久成年人网站| 一区二区三区在线资源| 国产网站欧美日韩免费精品在线观看 | 91亚洲一区二区| 国产视频在线观看免费| 国产成人精品免费| 久久资源av| 中文字幕日本在线| 中文字幕精品一区| 日本高清视频免费在线观看| 成人影音在线| 91福利在线看| 国产不卡的av| 日韩中出av| 亚洲一品av免费观看| 一级片视频免费看| 欧美99久久| 国产成人精品在线播放| 国产女人爽到高潮a毛片| 91香蕉视频污| avove在线观看| 欧美成人影院| 日韩欧美成人激情| 法国空姐电影在线观看| 68国产成人综合久久精品| 欧美一级大胆视频| 一区精品在线观看| gogo大胆日本视频一区| 亚洲成人动漫在线| 丰乳肥臀在线| 欧美日韩激情在线| 日本黄色特级片| 午夜国产精品视频| 国产成人精品久久二区二区| www.国产黄色| 国产精品超碰97尤物18| 国产美女在线一区| 不卡av影片| 日韩精品一区二区三区视频播放 | 久草免费在线视频观看| 久久激情中文| 国产富婆一区二区三区| 日本在线观看网站| 亚洲成a人v欧美综合天堂下载| 久久久久国产精品熟女影院| 97精品久久| www.日韩欧美| 97久久久久久| 久久精品免费在线| 国产在线精品免费| 奇米精品在线| 九色porny丨首页入口在线| 91麻豆精东视频| 国产日韩一级二级三级| 亚洲国产高清aⅴ视频| 99久久伊人久久99| 精品视频123区在线观看| 欧美牲交a欧美牲交aⅴ免费下载| 91视频亚洲| 中文字幕亚洲自拍| 成人av网站在线播放| 成人av在线播放网址| 亚洲精品天堂成人片av在线播放| 久久影视精品| 色偷偷88888欧美精品久久久 | 中文一区二区三区四区| 日韩色av导航| 91片黄在线观看喷潮| 国产区在线观看成人精品 | 综合在线一区| 成人妇女淫片aaaa视频| av电影在线观看| 久久伦理在线| 久久人人爽亚洲精品天堂| 中文字幕在线播放不卡| 国产精品久久精品日日| 亚洲自拍偷拍图区| 欧美牲交a欧美牲交aⅴ免费真 | 超级碰在线观看| 国产免费拔擦拔擦8x高清在线人 | 99久久久精品| 六月激情综合网| 九九热精品视频在线观看| 国产999精品久久久影片官网| 精品人妻午夜一区二区三区四区| 一区二区高清在线| 人妻体内射精一区二区三区| 欧美欧美全黄| 久久久久久久久久久久久久久久av | 一本加勒比波多野结衣| 亚洲国产网站| 欧美日韩电影一区二区| 成人在线视频免费| 色悠悠久久88| 中文字幕一区二区三区四区免费看 | 免费成人黄色大片| 黄色aaa视频| 999国产精品| 亚洲综合一区二区不卡| 国产乱码在线| 伊人伊成久久人综合网站| 国产美女三级无套内谢| 国产欧美一区二区精品久导航| 亚洲女人在线观看| 中文日韩欧美| 亚洲激情电影在线| 毛片在线网站| 久久久精品美女| 午夜视频1000| 欧美军同video69gay| 国产一级片网址| 国产女人aaa级久久久级| 日本黄色www| 国产欧美亚洲一区| 真人做人试看60分钟免费| 国产亚洲一卡2卡3卡4卡新区| 国产精品综合网站| 天使と恶魔の榨精在线播放| 亚洲国产天堂久久综合| 一级全黄裸体免费视频| 天天爽夜夜爽夜夜爽精品视频| 美女100%无挡| 99久久综合狠狠综合久久| 99中文字幕在线| 天天天综合网| 久久另类ts人妖一区二区| а√在线中文网新版地址在线| 久久中文字幕导航| www视频在线免费观看| 亚洲你懂的在线视频| 亚洲码无人客一区二区三区| 极品尤物av久久免费看| 国产日韩av网站| 成人av资源电影网站| 国产欧美亚洲精品| 手机av在线| 久久99久久亚洲国产| 免费在线黄色影片| 日韩一区二区三区av| 成人黄色av播放免费| 成人免费在线网| 国内免费精品视频| 日韩三级影院| av一区二区在线播放| 成人高清免费观看| 91精品国产综合久久久久久| 57pao国产精品一区| 久久久天堂国产精品| 99国产精品免费| 久青草国产在线| 国产一区日韩一区| 9i在线看片成人免费| 亚洲国产高清自拍| 日本xxxxx18| 亚洲欧美专区| 97成人精品区在线播放| 嫩草在线视频| 日韩小视频在线观看专区| 一级片免费观看视频| 色婷婷av一区二区三区软件 | 视频三区二区一区| 成人免费a级片| 欧美2区3区4区| 成人一区二区在线| 亚洲成人五区| 亚洲自拍高清视频网站| 在线观看v片| 2024亚洲男人天堂| 中文字幕在线免费观看视频| 午夜精品在线视频| 爱看av在线入口| 欧美精品久久久久久久| 欧美bbbxxxxx| 欧美国产日本高清在线| 国产精品蜜芽在线观看| 久久免费高清视频| 水蜜桃在线视频| 97在线视频免费看| 美女100%一区| 国产精品揄拍500视频| 黄色日韩网站| 成人在线资源网址| 精品福利网址导航| 欧美日韩精品久久| 999久久久精品国产| 最新视频 - x88av| 女生裸体视频一区二区三区| 天堂…中文在线最新版在线| 香蕉久久a毛片| 艹b视频在线观看| 成人黄色av电影| 91精品人妻一区二区| 国产精品丝袜一区| 日韩欧美a级片| 亚洲国产精品欧美一二99| 伦av综合一区| 在线成人午夜影院| 日本又骚又刺激的视频在线观看| 国产亚洲人成a一在线v站| 又爽又大又黄a级毛片在线视频| 欧美激情中文字幕乱码免费| 欧美a级在线观看| 国产精品视频区| 视频亚洲一区二区| 欧美lavv| 欧美日本在线| 日本中文字幕网址| 精品一区二区在线观看| 任你躁av一区二区三区| 久久久噜噜噜久久人人看| 1024手机在线视频| 亚洲va欧美va人人爽| 中文字幕视频二区| 亚洲欧美日韩精品久久奇米色影视| 欧美激情午夜| 欧美国产亚洲视频| 成人直播视频| 国产一区二区三区无遮挡| 欧美天天综合| 少妇高潮喷水在线观看| 国产精品一二三四| 欧美成人精品一区二区综合免费| 国产日韩欧美麻豆| 日本一区二区网站| 日韩欧美中文在线| 国产av一区二区三区精品| 日韩美女一区二区三区| aⅴ在线视频男人的天堂| 欧美精品免费在线| 亚洲国产成人二区| 国产91视觉| 欧美独立站高清久久| 青青草原av在线播放| 成人美女视频在线观看| jizz18女人高潮| 婷婷色在线资源| 欧美va亚洲va国产综合| 免费观看成人高潮| 欧美亚洲成人精品| 一级欧美视频| 自拍另类欧美| 水蜜桃久久夜色精品一区的特点| 久久久精品人妻一区二区三区| 国产精品欧美综合在线| 美日韩一二三区| 欧美精品一区视频| 蜜桃传媒在线观看免费进入| 国产精品国产亚洲伊人久久| 国产精品久久久久av蜜臀| 热这里只有精品| 六月婷婷一区| 亚洲第九十七页| 日韩欧美精品网站| 国产成人精品无码高潮| 久久亚洲精品毛片| 日韩精品三级| 三级在线免费观看| 国产又粗又猛又爽又黄91精品| 搜索黄色一级片| 欧美一区二区三区在线| 亚洲国产精品久久久久久久| 欧美另类在线播放| 日韩精品成人| 人人妻人人澡人人爽欧美一区| 成人免费不卡视频| 日韩精品――中文字幕| 亚洲精品999| 亚洲日本天堂| 欧美日韩另类综合| 美女日韩在线中文字幕| 色欲av无码一区二区三区| 欧美午夜性色大片在线观看| 日韩黄色影片| 国产精品久久久久久av下载红粉| 不卡av一区二区| 久久国产色av免费观看| 国产精品久久久久影院色老大 | 午夜精品久久久久久久久久| 色婷婷视频在线| 国模私拍视频一区| 欧美电影免费网站| 无遮挡又爽又刺激的视频| 91色综合久久久久婷婷| 91麻豆精品在线| 日韩中文在线视频| 日本午夜免费一区二区| 日韩中文在线字幕| www.99精品| 久久亚洲精品石原莉奈| 中文字幕日韩有码| 日本精品在线播放| 国产乱子伦农村叉叉叉| 久久综合色鬼综合色| 国产剧情久久久| 久热爱精品视频线路一| 国产欧美日韩影院| 自拍偷拍21p| 一区二区三区四区中文字幕| 黄色影院在线播放|