用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.validate使用攻略 第一部
Jul 01 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
Jan 16 Javascript
js propertychange和oninput事件
Sep 28 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
Jul 29 Javascript
微信小程序 倒计时组件实现代码
Oct 24 Javascript
浅谈Vue.js
Mar 02 Javascript
JS Input里添加小图标的两种方法
Nov 11 Javascript
简单的Vue SSR的示例代码
Jan 12 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
[原创]微信小程序获取网络类型的方法示例
Mar 01 Javascript
一文了解vue-router之hash模式和history模式
May 31 Javascript
vue判断按钮是否可以点击
Apr 09 Vue.js
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解答方法
2012/02/04 PHP
深入解析php之sphinx
2013/05/15 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
PHP自定义错误用法示例
2016/09/28 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
python实现统计文本中单词出现的频率详解
2019/05/20 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
django使用xadmin的全局配置详解
2019/11/15 Python
Python input函数使用实例解析
2019/11/22 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
招商业务员岗位职责
2013/12/16 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
父母寄语大全
2014/04/12 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
详解pytorch创建tensor函数
2022/03/22 Python