炸裂,用JS创建一个录屏功能

开发 前端
OBS studio很酷,但 JavaScript 更酷,现在,我们用 JavaScript 创建自己的录屏功能。首先,创建一个HTML文件,包含记录按钮和一个播放标签。

[[434260]]

OBS studio很酷,但 JavaScript 更酷,现在,我们用 JavaScript 创建自己的录屏功能。

首先,创建一个HTML文件,包含记录按钮和一个播放标签,内容如下:

  1. <!DOCTYPE html> 
  2. <html> 
  3.   <head> 
  4.     <title>Parcel Sandbox</title> 
  5.     <meta charset="UTF-8" /> 
  6.   </head> 
  7.   <body> 
  8.     <video class="video" width="600px" controls></video> 
  9.     <button class="record-btn">record</button> 
  10.  
  11.     <script src="./index.js"></script> 
  12.   </body> 
  13. </html> 

然后在创建 index.js,监听按钮的点击:

  1. let btn = document.querySelector(".record-btn"); 
  2.  
  3. btn.addEventListener("click"function () { 
  4.   console.log("hello"); 
  5. }); 

在浏览器中打开 html文件,点击按钮,我们可以在控制台看到打印的 hello。


现在把打印去掉,换成如下的内容:

  1. let btn = document.querySelector(".record-btn"); 
  2.  
  3. btn.addEventListener("click", async function () { 
  4.   let stream = await navigator.mediaDevices.getDisplayMedia({ 
  5.     video: true 
  6.   }); 
  7. }); 

现在点击按钮,会弹出屏幕选择框: 

因为,我现在用的是两个屏幕,所以会出现两个选择。

现在你可能认为选择一个屏幕,然后点击分享,就开始录制了。非也,这个比我们想象中的复杂点。我们要使用 MediaRecorder 来录制我们的视频。

  1. let btn = document.querySelector(".record-btn"
  2.  
  3. btn.addEventListener("click", async function () { 
  4.   let stream = await navigator.mediaDevices.getDisplayMedia({ 
  5.     video: true 
  6.   }) 
  7.  
  8.   // 需要更好的浏览器支持 
  9.   const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
  10.              ? "video/webm; codecs=vp9"  
  11.              : "video/webm" 
  12.     let mediaRecorder = new MediaRecorder(stream, { 
  13.         mimeType: mime 
  14.     }) 
  15.     // 必须手动启动 
  16.     mediaRecorder.start() 
  17. }) 

当我们的屏幕被录制下来时,mediaRecorder 会给我们提供分块的数据,我们需要将这些数据存储在一个变量中。

  1. let btn = document.querySelector(".record-btn"
  2.  
  3. btn.addEventListener("click", async function () { 
  4.   let stream = await navigator.mediaDevices.getDisplayMedia({ 
  5.     video: true 
  6.   }) 
  7.  
  8.   // 需要更好的浏览器支持 
  9.   const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
  10.              ? "video/webm; codecs=vp9"  
  11.              : "video/webm" 
  12.     let mediaRecorder = new MediaRecorder(stream, { 
  13.         mimeType: mime 
  14.     }) 
  15.  
  16.     let chunks = [] 
  17.     mediaRecorder.addEventListener('dataavailable'function(e) { 
  18.         chunks.push(e.data) 
  19.     }) 
  20.  
  21.     // 必须手动启动 
  22.     mediaRecorder.start() 
  23. }) 

现在,当我们点击停止共享按钮时,希望在我们的 video元素中播放录制的视频,可以这么做:

  1. let btn = document.querySelector(".record-btn"
  2.  
  3. btn.addEventListener("click", async function () { 
  4.   let stream = await navigator.mediaDevices.getDisplayMedia({ 
  5.     video: true 
  6.   }) 
  7.  
  8.   // 需要更好的浏览器支持 
  9.   const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
  10.              ? "video/webm; codecs=vp9"  
  11.              : "video/webm" 
  12.     let mediaRecorder = new MediaRecorder(stream, { 
  13.         mimeType: mime 
  14.     }) 
  15.  
  16.     let chunks = [] 
  17.     mediaRecorder.addEventListener('dataavailable'function(e) { 
  18.         chunks.push(e.data) 
  19.     }) 
  20.  
  21.      mediaRecorder.addEventListener('stop'function(){ 
  22.           let blob = new Blob(chunks, { 
  23.               type: chunks[0].type 
  24.           }) 
  25.  
  26.           let video = document.querySelector(".video"
  27.           video.src = URL.createObjectURL(blob) 
  28.       }) 
  29.  
  30.  
  31.     // 必须手动启动 
  32.     mediaRecorder.start() 
  33. }) 

现在基本就可以完成了,可以在润色下,如自动下载录制的视频,可以这么做:

  1. let btn = document.querySelector(".record-btn"
  2.  
  3. btn.addEventListener("click", async function () { 
  4.   let stream = await navigator.mediaDevices.getDisplayMedia({ 
  5.     video: true 
  6.   }) 
  7.  
  8.   // 需要更好的浏览器支持 
  9.   const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
  10.              ? "video/webm; codecs=vp9"  
  11.              : "video/webm" 
  12.     let mediaRecorder = new MediaRecorder(stream, { 
  13.         mimeType: mime 
  14.     }) 
  15.  
  16.     let chunks = [] 
  17.     mediaRecorder.addEventListener('dataavailable'function(e) { 
  18.         chunks.push(e.data) 
  19.     }) 
  20.  
  21.    mediaRecorder.addEventListener('stop'function(){ 
  22.       let blob = new Blob(chunks, { 
  23.           type: chunks[0].type 
  24.       }) 
  25.       let url = URL.createObjectURL(blob) 
  26.  
  27.       let video = document.querySelector("video"
  28.       video.src = url 
  29.  
  30.       let a = document.createElement('a'
  31.       a.href = url 
  32.       a.download = 'video.webm' 
  33.       a.click() 
  34.   }) 
  35.  
  36.  
  37.     // 必须手动启动 
  38.     mediaRecorder.start() 
  39. }) 

现在,最基本的一个录制功能就完善了,动手来试试吧!!

作者:Lokender Singh 译者:前端小智

来源:dev 原文:https://dev.to/0shuvo0/lets-create-a-screen-recorder-with-js-3leb

 

责任编辑:姜华 来源: 大迁世界
相关推荐

2022-03-04 14:17:08

JS工具库录音

2023-05-10 08:05:41

GoWeb应用

2018-12-04 15:10:56

Python微信备忘录

2022-06-21 08:52:47

Node.js服务端JavaScript

2023-10-18 08:03:40

2021-04-23 16:40:49

Three.js前端代码

2018-12-04 13:30:28

Javascript编译原理前端

2012-06-07 09:00:06

2016-03-01 14:37:47

华为

2022-06-05 13:52:32

Node.jsDNS 的原理DNS 服务器

2013-04-06 18:52:20

2022-10-20 11:49:49

JS动画帧,CSS

2022-03-07 09:20:00

JavaScripThree.jsNFT

2023-06-05 05:50:52

GNOMEShell

2020-12-02 13:00:17

Recast.AI聊天机器人人工智能

2012-04-24 09:22:16

软件测试

2022-07-07 08:50:26

Python可视化模块代码

2016-03-08 09:52:22

xcode插件开发

2020-04-09 08:47:38

Java对象线程

2013-01-15 11:42:50

点赞
收藏

51CTO技术栈公众号