用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 相关文章推荐
javascript编程起步(第二课)
Jan 10 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
Oct 29 Javascript
Jquery 在页面加载后执行的几种方式
Mar 14 Javascript
json的定义、标准格式及json字符串检验
May 11 Javascript
JS根据生日算年龄的方法
May 05 Javascript
jQuery简单实现中间浮窗效果
Sep 04 Javascript
基于slideout.js实现移动端侧边栏滑动特效
Nov 28 Javascript
微信小程序自定义弹窗wcPop插件
Nov 19 Javascript
vue使用pdfjs显示PDF可复制的实现方法
Dec 14 Javascript
vue实现路由监听和参数监听
Oct 29 Javascript
JavaScript中遍历的十种方法总结
Dec 15 Javascript
js实现鼠标切换图片(无定时器)
Jan 27 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制作静态网站的模板框架(二)
2006/10/09 PHP
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
jQuery.extend 函数详解
2012/02/03 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python中max函数用法实例分析
2015/07/17 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
师范生自我鉴定
2014/03/20 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
施工员岗位职责
2015/02/10 职场文书
服务行业标语口号
2015/12/26 职场文书
学习心理学心得体会
2016/01/22 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
Redis Lua脚本实现ip限流示例
2022/07/15 Redis