用JS创建一个录屏功能


Posted in Javascript onNovember 11, 2021

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

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

内容如下:

<!DOCTYPE html> 
<html> 
  <head> 
    <title>Parcel Sandbox</title> 
    <meta charset="UTF-8" /> 
  </head> 
  <body> 
    <video class="video" width="600px" controls></video> 
    <button class="record-btn">record</button> 
 
    <script src="./index.js"></script> 
  </body> 
</html>

然后在创建 index.js

监听按钮的点击:

let btn = document.querySelector(".record-btn"); 
 
btn.addEventListener("click", function () { 
  console.log("hello"); 
});

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

用JS创建一个录屏功能

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

let btn = document.querySelector(".record-btn"); 
 
btn.addEventListener("click", async function () { 
  let stream = await navigator.mediaDevices.getDisplayMedia({ 
    video: true 
  }); 
});

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

用JS创建一个录屏功能

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

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

let btn = document.querySelector(".record-btn") 
 
btn.addEventListener("click", async function () { 
  let stream = await navigator.mediaDevices.getDisplayMedia({ 
    video: true 
  }) 
 
  // 需要更好的浏览器支持 
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
             ? "video/webm; codecs=vp9"  
             : "video/webm" 
    let mediaRecorder = new MediaRecorder(stream, { 
        mimeType: mime 
    }) 
    // 必须手动启动 
    mediaRecorder.start() 
})

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

let btn = document.querySelector(".record-btn") 
 
btn.addEventListener("click", async function () { 
  let stream = await navigator.mediaDevices.getDisplayMedia({ 
    video: true 
  }) 
 
  // 需要更好的浏览器支持 
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
             ? "video/webm; codecs=vp9"  
             : "video/webm" 
    let mediaRecorder = new MediaRecorder(stream, { 
        mimeType: mime 
    }) 
 
    let chunks = [] 
    mediaRecorder.addEventListener('dataavailable', function(e) { 
        chunks.push(e.data) 
    }) 
 
    // 必须手动启动 
    mediaRecorder.start() 
})

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

let btn = document.querySelector(".record-btn") 
 
btn.addEventListener("click", async function () { 
  let stream = await navigator.mediaDevices.getDisplayMedia({ 
    video: true 
  }) 
 
  // 需要更好的浏览器支持 
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
             ? "video/webm; codecs=vp9"  
             : "video/webm" 
    let mediaRecorder = new MediaRecorder(stream, { 
        mimeType: mime 
    }) 
 
    let chunks = [] 
    mediaRecorder.addEventListener('dataavailable', function(e) { 
        chunks.push(e.data) 
    }) 
 
     mediaRecorder.addEventListener('stop', function(){ 
          let blob = new Blob(chunks, { 
              type: chunks[0].type 
          }) 
 
          let video = document.querySelector(".video") 
          video.src = URL.createObjectURL(blob) 
      }) 
 
 
    // 必须手动启动 
    mediaRecorder.start() 
})

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

可以这么做:

let btn = document.querySelector(".record-btn") 
 
btn.addEventListener("click", async function () { 
  let stream = await navigator.mediaDevices.getDisplayMedia({ 
    video: true 
  }) 
 
  // 需要更好的浏览器支持 
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")  
             ? "video/webm; codecs=vp9"  
             : "video/webm" 
    let mediaRecorder = new MediaRecorder(stream, { 
        mimeType: mime 
    }) 
 
    let chunks = [] 
    mediaRecorder.addEventListener('dataavailable', function(e) { 
        chunks.push(e.data) 
    }) 
 
   mediaRecorder.addEventListener('stop', function(){ 
      let blob = new Blob(chunks, { 
          type: chunks[0].type 
      }) 
      let url = URL.createObjectURL(blob) 
 
      let video = document.querySelector("video") 
      video.src = url 
 
      let a = document.createElement('a') 
      a.href = url 
      a.download = 'video.webm' 
      a.click() 
  }) 
 
 
    // 必须手动启动 
    mediaRecorder.start() 
})

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

到此这篇关于用JS创建一个录屏功能的文章就介绍到这了,更多相关JS创建一个录屏功能内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery 学习之一 对象访问
Nov 23 Javascript
jQuery之过滤元素操作小结
Nov 30 Javascript
js函数调用的方式
May 06 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
Jul 10 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
javascript中JSON对象与JSON字符串相互转换实例
Jul 11 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
Oct 09 Javascript
vue文件树组件使用详解
Mar 29 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
Apr 16 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
Jun 27 Javascript
在vue项目中使用sass语法问题
Jul 18 Javascript
微信小程序canvas分享海报功能
Oct 31 Javascript
JavaScript数组 几个常用方法总结
Nov 11 #Javascript
JavaScript 事件捕获冒泡与捕获详情
JavaScript 定时器详情
Nov 11 #Javascript
使用javascript解析二维码的三种方式
Nov 11 #Javascript
实现一个简单得数据响应系统
Nov 11 #Javascript
JavaScript函数柯里化
Nov 07 #Javascript
JS数组去重详情
Nov 07 #Javascript
You might like
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
python自定义异常实例详解
2017/07/11 Python
Python 字符串换行的多种方式
2018/09/06 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
Django中的用户身份验证示例详解
2019/08/07 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
P/Invoke是什么
2015/07/31 面试题
水务局局长岗位职责
2013/11/28 职场文书
二年级数学教学反思
2014/01/21 职场文书
周年庆典邀请函范文
2014/01/23 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
企业文化理念标语
2014/06/10 职场文书
委托书的写法
2014/09/16 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
物业工程部岗位职责
2015/02/11 职场文书
实习生个人总结范文
2015/02/28 职场文书
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL