用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 剧场版 你必须知道的javascript
May 27 Javascript
javascript重写alert方法的实例代码
Mar 29 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
Jun 04 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
jQuery 处理页面的事件详解
Jan 20 Javascript
javascript使用avalon绑定实现checkbox全选
May 06 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
Jan 08 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
Apr 29 Javascript
js+html5实现侧滑页面效果
Jul 15 Javascript
vue-router命名视图的使用讲解
Jan 19 Javascript
vue + axios get下载文件功能
Sep 25 Javascript
js 执行上下文和作用域的相关总结
Feb 08 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
一个分页的论坛
2006/10/09 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
js 小数取整的函数
2010/05/10 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
Python实现备份文件实例
2014/09/16 Python
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python运行其他程序的实现方法
2017/07/14 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
应用数学自荐书范文
2013/11/24 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
公司年会开场白
2015/06/01 职场文书
单位车辆管理制度
2015/08/05 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
pandas数值排序的实现实例
2021/07/25 Python
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技