首页 > 其他分享 >记录--纯前端如何实现录屏并保存视频到本地

记录--纯前端如何实现录屏并保存视频到本地

时间:2023-09-19 18:33:46浏览次数:35  
标签:MediaRecorder const -- 前端 webm 录屏 video chunks button

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

作为一个资深的切图仔,我们难免会需要用到把自己写的页面的一些功能通过视频的方式分享给别人。还有一个场景,就是当我们面试的时候,我们需要把我们的屏幕分享给面试官看,那么这些都是怎么实 现的呢?

那么接下来我们就通过这篇文章来学习一下如何实现一个浏览器录屏的功能。

navigator.mediaDevices

mediaDevices 是 Navigator 只读属性,返回一个 MediaDevices 对象,该对象可提供对相机和麦克风等媒体输入设备的连接访问,也包括屏幕共享。

const media = navigator.mediaDevices;

通过原型链可以查找到一些方法,如下图所示:

 其中 getDisplayMedia 方法来获取用户的屏幕分享或屏幕捕获流,通常用于制作屏幕录像或视频会议等应用。

navigator.mediaDevices.getDisplayMedia({
  video: true,
});

在这段代码中,请求获取包含视频流的媒体许可,并将其存储在名为 stream 的变量中,以便后续使用。这个流可以用于在网页上显示屏幕共享或进行其他媒体处理操作。

又因为该方法是异步的,我们要编写如下代码:

<body>
  <button>共享屏幕</button>
  <script>
    const button = document.querySelector("button");
    button.addEventListener("click", async () => {
      const stream = await navigator.mediaDevices.getDisplayMedia({
        video: true,
      });
    });
  </script>
</body>

通过点击 button 按钮后会如下图所示效果:

这个时候 stream 流我们是拿到了。

MediaRecorder

MediaRecorder 是一个 Web API,用于在浏览器中进行媒体录制,主要用于录制音频和视频。它允许你从不同的来源,例如麦克风、摄像头、屏幕共享或其他媒体元素,捕获音频和视频数据,并将其保存为文件或进行实时流媒体传输。

通过调用 MediaRecorder.isTypeSupported() 方法会判断其 MIME 格式能否被客户端录制。它支持的类型主要有以下几种方式:

const types = [
  "video/webm",
  "audio/webm",
  "video/webm;codecs=vp8",
  "video/webm;codecs=daala",
  "video/webm;codecs=h264",
  "audio/webm;codecs=opus",
  "video/mpeg",
];

通过这种方式来查看当前浏览器是否支持该类型,如下代码所示:

const mime = MediaRecorder.isTypeSupported("video/webm;codecs=h264")
  ? "video/webm;codecs=h264"
  : "video/webm";

结果如下图所示:

const mediaRecorder = new MediaRecorder(stream, { mimeType: mime });

在这段代码里面,执行 new 关键字实例化 MediaRecorder 对象。该对象的结构如下图所示:

 我们可以通过监听它的事件来进行不同的操作,如下代码所示:

const chunks = [];
mediaRecorder.addEventListener("dataavailable", function (e) {
  chunks.push(e.data);
});

mediaRecorder.addEventListener("stop", () => {
  const blob = new Blob(chunks, { type: chunks[0].type });
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = "video.webm";
  a.click();
});

接下来我们来看看段代码的详细步骤:

  1. dataavailable 事件的监听器。当 MediaRecorder 有可用的音频/视频数据块时,它会触发此事件。在这里,每当数据可用时,将数据块(e.data)添加到 chunks 数组中。这是为了在录制完成后将这些数据块合并成一个完整的媒体文件。
  2. stop 事件的监听器。当录制停止时,MediaRecorder 会触发此事件。
  3. const blob = new Blob(chunks, { type: chunks[0].type });:使用 Blob 构造函数将 chunks 数组中的数据块合并成一个二进制对象(Blob 对象)。chunks[0].type 用于指定 Blob 的媒体类型,通常是 WebM。
  4. const url = URL.createObjectURL(blob);:使用 URL.createObjectURL 方法将 Blob 对象转换为一个临时 URL。这个 URL 可以用于创建下载链接。通过这个 url 传递给新创建的 a 元素用于下载功能。
  5. a.click() 通过模拟点击超链接来触发下载操作。用户将看到一个下载对话框,允许他们保存录制的媒体文件

这样就实现了一个屏幕录制功能了,并且通过该方法实现了一个音视频下载的功能。

完整代码

该功能的完整代码如下所示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button>共享屏幕</button>
    <script>
      const button = document.querySelector("button");
      button.addEventListener("click", async () => {
        const stream = await navigator.mediaDevices.getDisplayMedia({
          video: true,
        });

        const mime = MediaRecorder.isTypeSupported("video/webm;codecs=h264")
          ? "video/webm;codecs=h264"
          : "video/webm";

        const mediaRecorder = new MediaRecorder(stream, { mimeType: mime });

        const chunks = [];
        mediaRecorder.addEventListener("dataavailable", function (e) {
          chunks.push(e.data);
        });

        mediaRecorder.addEventListener("stop", () => {
          const blob = new Blob(chunks, { type: chunks[0].type });
          const url = URL.createObjectURL(blob);
          const a = document.createElement("a");
          a.href = url;
          a.download = "video.webm";
          a.click();
        });
        mediaRecorder.start();
      });
    </script>
  </body>
</html>

完整效果如下图所示:

 你也可以直接在其他任何一个页面,将 js 代码修改一下,然后直接复制粘贴到控制台上,并点击页面,如下所示:

-const button = document.querySelector("button");
-button.addEventListener("click", async () => {

+const body = document.body;
+body.addEventListener("click", async () => {

紧接着将代码复制粘贴到浏览器控制台上面,并点击页面的空白处:

通过这种方式就实现了一种屏幕录制或者屏幕分享的功能了。

最后分享两个我的两个开源项目,它们分别是:

本文转载于:

https://juejin.cn/post/7280057907055869992

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:MediaRecorder,const,--,前端,webm,录屏,video,chunks,button
From: https://www.cnblogs.com/smileZAZ/p/17715468.html

相关文章

  • 探索相芯Animoji:与动漫滤镜一起开启独特的虚拟表情世界(Android)
    相芯SDK中的Animoji特效通过结合人像分割、面部识别和虚拟角色技术,为用户提供了丰富多样的动态特效体验。使用任意手机摄像头,即可实时驱动Xmoji。支持含面部、舌头、眼球在内的56种基础表情,可融合成千上万表情形态,让虚拟卡通形象实时跟随人脸做出活灵活现的表情。相芯SDK还提供了丰......
  • Vue源码学习(七):合并生命周期(混入Vue.Mixin)
    好家伙, 1.使用场景现在来,来想一下,作为一个使用Vue的开发者,假设现在我们要使用created(),我们会如何使用1.1. .vue文件中使用<template><div><h1>{{message}}</h1></div></template><script>exportdefault{created(){this.message='......
  • 麻省理工学院新进展!人工智能协助机器人使用整体操控技术
    原创|BFT机器人麻省理工学院的研究人员开发了一种人工智能技术,使机器人能够制定复杂的计划,利用整只手而不仅仅是指尖来操控物体。这个模型可以在约一分钟内使用标准笔记本生成有效的计划。上图为一个机器人尝试将一个桶旋转180度。想象一下,你想要把一个又大又重的箱子搬上楼梯。......
  • openGauss学习笔记-74 openGauss 数据库管理-创建和管理视图
    openGauss学习笔记-74openGauss数据库管理-创建和管理视图74.1背景信息当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的......
  • Road To Reality(The roots of science)
    RoadToReality(Therootsofscience)TheGood,theTrue,andtheBeautiful......
  • 小区物业管理缴费报修活动报名商城小程序开源版开发
    小区物业管理缴费报修活动报名商城小程序开源版开发以下是小区物业管理缴费报修活动报名商城小程序开源版的功能列表:1.用户注册和登录2.小区信息展示(包括小区简介、周边设施等)3.物业公告显示和发布功能4.小区物业费用查询和缴费功能5.基础设施报修功能(包括提交报修信息、查看......
  • RPF(reverse path forwarding)
    RPF(反向路径转发)路由器收到组播数据报文后,只有确定这个数据报文是从自身连接到组播源的接口上收到的,才进行转发,否则丢弃RPF检查在大伯路由表中查找到组播报文源地址的路由如果该路由的出接口就是组播报文的入接口,RPF检查成功,否则RPF检查失败,报文丢弃注意:该路由的出接口就是组播报文......
  • 详解Spring缓存注解@Cacheable、@CachePut和@CacheEvict
    详解Spring缓存注解@Cacheable、@CachePut和@CacheEvict的使用简介在大型的应用程序中,缓存是一项关键技术,用于提高系统的性能和响应速度。Spring框架提供了强大的缓存功能,通过使用缓存注解可以轻松地集成缓存机制到应用程序中。本文将详细介绍Spring框架中的@Cacheable、@CachePu......
  • 【JavaScript保姆级教程】输出函数和初识变量
    @TOC前言JavaScript是一种强大的脚本语言,广泛应用于网页开发和应用程序编写。本文将全面介绍JavaScript中输出内容的方法,包括使用document.write()函数、调试工具如console.log()和对话框函数如alert(),以及变量的声明和赋值。此外,我们还将探索输入提示框prompt()函数的使用方法。深......
  • 【JavaScript保姆级教程】输出函数和初识变量
    @TOC前言JavaScript是一种强大的脚本语言,广泛应用于网页开发和应用程序编写。本文将全面介绍JavaScript中输出内容的方法,包括使用document.write()函数、调试工具如console.log()和对话框函数如alert(),以及变量的声明和赋值。此外,我们还将探索输入提示框prompt()函数的使用方法。深......