用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 request函数 用来获取url参数
May 17 Javascript
javascript 隔行换色函数代码
Oct 24 Javascript
js控制input框只读实现示例
Jan 20 Javascript
jQuery结合CSS制作动态的下拉菜单
Oct 27 Javascript
js倒计时简单实现代码
Aug 11 Javascript
Angularjs结合Bootstrap制作的一个TODO List
Aug 18 Javascript
基于AngularJS前端云组件最佳实践
Oct 20 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
Angular4 中常用的指令入门总结
Jun 12 Javascript
angular中实现li或者某个元素点击变色的两种方法
Jul 27 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
Jan 13 Javascript
详解JavaScript作用域和作用域链
Mar 19 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简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
php for 循环使用的简单实例
2016/06/02 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
python如何使用代码运行助手
2020/07/03 Python
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
什么是Web Service?
2012/07/25 面试题
演讲稿怎么写才完美
2014/01/02 职场文书
购房协议书范本
2014/04/11 职场文书
公司请假条格式
2014/04/11 职场文书
组织生活会发言材料
2014/12/15 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
安全责任协议书范本
2016/03/23 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书