精品欧美一区二区三区在线观看 _久久久久国色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麻豆高清视频| 欧美激情图片区| 8x8x成人免费视频| 久久天堂电影| 久久精品一级| 国产精品久久久久久久久免费桃花| 97超级碰碰碰久久久| 性色av浪潮av| 看黄网站在线| 麻豆国产一区二区| 中文字幕欧美视频在线| 国产主播在线看| 日本黄色不卡视频| 欧美日韩精品| 日韩一区二区在线免费观看| 国产精品沙发午睡系列| 黄色网址在线免费| 久久久久久久久久久99999| 97视频在线免费观看| 岛国av免费观看| av电影免费在线看| 成人涩涩免费视频| 国内外成人免费激情在线视频网站| 亚洲av无码成人精品区| 2024最新电影免费在线观看| 国产高清视频一区| 欧美高清在线播放| 久草免费资源站| 91亚洲精品| 欧美丝袜第一区| 日本成人三级| 中文字幕+乱码+中文字幕明步| 精品理论电影| 欧美美女激情18p| 超碰97免费观看| 亚洲精品一区二区三区蜜桃| 91久久中文| 亚洲欧洲在线播放| 亚洲xxx在线观看| 91福利国产在线观看菠萝蜜| 国产精品女主播av| 亚洲r级在线观看| 国产一级av毛片| 人人精品亚洲| 欧美熟乱第一页| 看一级黄色录像| 天天躁日日躁狠狠躁喷水| 三级在线观看一区二区| 日韩网站免费观看| 动漫av在线免费观看| 成人av在线播放| 天天影视涩香欲综合网| 任我爽在线视频精品一| 天堂在线中文| 精品一区精品二区高清| 欧美精品videosex极品1| 国产在线观看免费视频软件| 国产精品xxxav免费视频| 色综合久久久久网| 欧美精品一区二区性色a+v| 91在线观看| 波多野结衣一区二区三区| 日韩av片永久免费网站| 极品久久久久久| 国产精品传媒| 亚洲精品国产精品国产自| 婷婷免费在线观看| 国产污视频在线播放| 中文字幕一区av| 伊人久久大香线蕉精品| 天堂在线观看免费视频| 99re这里都是精品| 成人www视频在线观看| 国产午夜性春猛交ⅹxxx| 久久福利影院| 亚洲美女自拍视频| 麻豆免费在线观看视频| 精品淫伦v久久水蜜桃| 69成人精品免费视频| 少妇高清精品毛片在线视频| 日本片在线观看| 中文字幕不卡的av| 99热这里只有精品7| 成人免费一区二区三区牛牛| 亚洲天堂a在线| 女同一区二区| 手机av免费在线观看| 91麻豆国产在线观看| 亚洲午夜精品久久久中文影院av| 视频午夜在线| 国产精品狼人久久影院观看方式| av 日韩 人妻 黑人 综合 无码| 在线观看a视频| 国产性天天综合网| 国产日韩欧美二区| 午夜精品久久久久久久96蜜桃 | 国产日韩一区二区三区在线| 亚洲全黄一级网站| 久久久久无码精品国产sm果冻 | jizz一区二区三区| 日本高清成人免费播放| 成人免费播放器| 日韩成人影视| 亚洲va在线va天堂| 成人小视频在线观看免费| 亚洲第一导航| 风间由美一区| 26uuu亚洲综合色| 在线精品日韩| 中文日产幕无线码一区二区| 大荫蒂欧美视频另类xxxx| 色哟哟免费网站| www红色一片_亚洲成a人片在线观看_| 日韩一区在线看| 亚洲三区在线| 天天干天天操天天做| 成人啊v在线| 色久综合一二码| 色哟哟视频在线| 久久97精品| 久久成人精品视频| 九九视频免费在线观看| 午夜国产精品视频| 久久久久五月天| 中文文字幕一区二区三三| 99综合电影在线视频| 欧美黑人3p| 男女在线视频| 欧美日韩国产色视频| 手机在线观看日韩av| 99精品国产高清一区二区麻豆| 精品播放一区二区| 五月婷婷综合在线观看| 精品国产一区二区三区噜噜噜| 性欧美暴力猛交69hd| 亚洲爱爱综合网| 亚洲精品成a人| 在线观看免费视频高清游戏推荐| 欧美极品中文字幕| 中文字幕av一区| 久久99国产综合精品免费| 日韩成人av影视| 成人精品视频久久久久| 高清日韩av电影| 色先锋久久av资源部| 国产福利短视频| 第四色成人网| 色综合91久久精品中文字幕 | 欧美日韩国产限制| 影音先锋资源av| 欧美福利一区| 5g影院天天爽成人免费下载| 天天色天天操天天射| 亚洲午夜av在线| 欧美午夜性生活| 日本精品在线观看| 亚洲欧美激情在线视频| 亚洲天堂视频网站| 国产午夜精品一区二区| 日本成人中文字幕在线| 欧美专区一区| 欧美黑人极品猛少妇色xxxxx| 亚洲精品无遮挡| 五月婷婷久久丁香| 9.1成人看片免费版| 久久婷婷影院| 在线视频一区观看| 日韩免费成人| 4438全国亚洲精品在线观看视频| 亚洲在线视频播放| 91原创在线视频| 青青在线视频免费| 欧美xxxxx视频| 日本欧美一二三区| 成人三级黄色免费网站| 亚洲国产精品人人做人人爽| 欧美特级aaa| 亚洲免费专区| 久久久亚洲国产天美传媒修理工| 五月天福利视频| 一区二区在线观看视频在线观看| 人妻av一区二区| 日韩精品电影在线| 欧美少妇一级片| 美女午夜精品| 国产综合视频在线观看| 国产高清在线观看| 制服.丝袜.亚洲.中文.综合| 精品在线免费观看视频| 国产拍欧美日韩视频二区| 人妻久久久一区二区三区| 日韩精品成人在线观看| 欧洲中文字幕国产精品| 四虎免费在线观看| 欧美色成人综合| 美女爆乳18禁www久久久久久| 一区二区久久| 国偷自产av一区二区三区小尤奈| 欧美日韩国产v| 亚洲欧美日本精品| 中文字幕人妻一区二区三区视频| 亚洲自拍偷拍欧美| 少妇高潮一69aⅹ| 久久精品一本| 日韩高清dvd| 免费观看成人性生生活片| 欧美另类极品videosbest最新版本| 青青草在线免费视频| 欧美日韩亚洲视频一区| 国产激情无码一区二区三区| 久久成人av少妇免费| 欧美日韩亚洲一| 欧美日本一区| 亚洲天堂电影网| 国产成人影院| 国产精品综合不卡av| 日本最新在线视频| 日韩经典第一页| 高潮毛片又色又爽免费 | 国产精品久久久久久久久久10秀| 国产精品中文字幕在线| 黄色污网站在线观看| 欧美另类高清videos| 男人的天堂在线视频免费观看| 这里只有精品99re| 天天干天天操天天操| 欧美日在线观看| 欧美一区二区激情视频| 亚洲大片在线观看| 538精品在线观看| 中文字幕亚洲欧美在线不卡| 欧美激情视频二区| 激情av综合网| 国产一区二区三区小说| 无码少妇一区二区三区| 国产精品av电影| 91高清在线观看视频| 久久香蕉国产线看观看av| 美女黄视频在线观看| 最近2019中文字幕第三页视频| 国产丰满美女做爰| 岛国av一区二区三区| 97久久久久久久| 精品露脸国产偷人在视频| 色婷婷在线观看视频| 国产精品国产三级国产普通话三级 | 成人国产视频在线观看| 好吊操视频这里只有精品| 国产成人午夜精品5599| 伊人av在线播放| 岛国精品一区二区| 亚洲熟女一区二区| 蜜桃免费网站一区二区三区| 国产免费内射又粗又爽密桃视频| 99久久夜色精品国产亚洲96| 永久免费在线看片视频| 欧美日韩午夜| 黄网站欧美内射| 国产亚洲综合精品| 日本男人操女人| 美国av一区二区| 日本人dh亚洲人ⅹxx| 成年人网站91| 欧美做受xxxxxⅹ性视频| 国产精品99久久久久久似苏梦涵| 色欲无码人妻久久精品| 成人av免费在线观看| 精品人妻互换一区二区三区| 国产精品免费丝袜| 国产精品老熟女一区二区| 午夜精品久久久久影视| 波多野结衣影片| 91精品免费在线| 四季av日韩精品一区| 在线视频精品一| 性感美女一级片| 尤物yw午夜国产精品视频| 国产激情在线视频| 国色天香2019中文字幕在线观看| 搜成人激情视频| 亚洲影院色在线观看免费| 欧美激情极品| 一区二区中文字幕在线| www.超碰在线观看| 香蕉加勒比综合久久| 色老头一区二区| 欧美一区二区私人影院日本| 久久久久香蕉视频| 精品久久久精品| 一级视频在线播放| 91成人看片片| 伊人手机在线视频| 9191久久久久久久久久久| 人妻精品一区二区三区| 正在播放国产一区| gratisvideos另类灌满| 国产日韩在线视频| 日韩欧美黄色| 久久天天东北熟女毛茸茸| 玖玖在线精品| 日本道中文字幕| 中文字幕一区二区三区乱码在线| 99热国产在线观看| 欧美一区二区三区日韩| 男人天堂网在线| 久久久久久久999| av日韩久久| 999在线观看免费大全电视剧| 麻豆国产一区| 亚洲精品二区| 另类av一区二区| 欧美激情 亚洲| 亚洲免费观看高清在线观看| 久草福利资源在线观看| 欧洲激情一区二区| 性感美女视频一二三| 欧美精品久久久久久久免费观看 | 五月天视频一区| 国产视频aaa| 精品国产一区二区三区久久影院 | 久久久久国产视频| 欧美极品在线| 亚洲a成v人在线观看| 国产一区日韩| 日本福利视频在线| 首页国产欧美久久| 亚洲成人av免费在线观看| 亚洲激情自拍视频| 国产又粗又黄又爽| 中日韩美女免费视频网址在线观看 | 手机看片一区二区| 久久久免费在线观看| 亚洲电影一区| 女人帮男人橹视频播放| 国产成人精品三级麻豆| 日日夜夜精品视频免费观看| 国产精品免费久久久久| 成人黄色片在线观看| 911国产精品| 国产美女av在线| 亚洲在线免费看| 欧美午夜电影在线观看 | 中文字幕一区二区久久人妻| 一区二区欧美在线| 成人黄色视屏网站| 99在线影院| 欧美精品一级| 在线中文字日产幕| 亚洲国产精品久久久久婷婷884| 成人毛片在线免费观看| 伊人激情综合网| 日韩经典一区| 亚洲一区三区在线观看| 久久99精品久久久久久久久久久久 | 99久久国产热无码精品免费| 欧美成人免费va影院高清| 国产精品av一区二区三区| 久久免费一区| 午夜欧美理论片| youjizz.com国产| 色偷偷一区二区三区| 1pondo在线播放免费| 成人国产精品色哟哟| 国产精品va| 亚洲污视频在线观看| 亚洲欧洲日韩女同| 成人毛片在线精品国产| 欧美在线免费看| 日韩中文欧美| 精品人妻一区二区免费| 色婷婷av一区二区三区软件| 男女啪啪在线观看| 国产欧美日韩在线播放| 视频一区欧美精品| 少妇一级黄色片| 精品国产一区久久| 成人不卡视频| 日韩一级性生活片| 国产无人区一区二区三区| 国产剧情久久久| 日韩一区二区三区在线播放| 国产精品高潮呻吟久久久久| 色婷婷狠狠18| 亚洲卡通欧美制服中文| 四虎精品在永久在线观看| 成人亲热视频网站| 亚洲在线观看| 成人在线电影网站| 在线视频欧美精品| 欧美videossex另类| 亚洲高清视频一区二区| 成人国产亚洲欧美成人综合网| 中日韩av在线|