用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 相关文章推荐
js控制div及网页相关属性的代码
Dec 19 Javascript
js 弹出框只弹一次(二次修改之后的)
Nov 26 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
Apr 14 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
Sep 11 Javascript
vue axios 在页面切换时中断请求方法 ajax
Mar 05 Javascript
vue-cli配置环境变量的方法
Jul 09 Javascript
基于JS开发微信网页录音功能的实例代码
Apr 30 Javascript
vue如何截取字符串
May 06 Javascript
解决vue项目router切换太慢问题
Jul 19 Javascript
vue中使用echarts的示例
Jan 03 Vue.js
解决await在forEach中不起作用的问题
Feb 25 Javascript
JS class语法糖的深入剖析
Jul 07 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常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
php二维码生成
2015/10/19 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
php工具型代码之印章抠图
2018/07/18 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
python实现爬虫下载漫画示例
2014/02/16 Python
Python实现的密码强度检测器示例
2017/08/23 Python
深入理解Django中内置的用户认证
2017/10/06 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
python读取并写入mat文件的方法
2019/07/12 Python
python 实现识别图片上的数字
2019/07/30 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
测绘工程本科生求职信
2013/10/10 职场文书
给排水专业应届生求职信
2013/10/12 职场文书
小区门卫岗位职责
2013/12/31 职场文书
新学期教师寄语
2014/04/02 职场文书
精神文明单位申报材料
2014/05/02 职场文书
安全生产年活动总结
2014/08/29 职场文书
初中成绩单评语
2014/12/29 职场文书