记录--纯前端也可以实现「用户无感知录屏」

这篇具有很好参考价值的文章主要介绍了记录--纯前端也可以实现「用户无感知录屏」。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

记录--纯前端也可以实现「用户无感知录屏」

前言

要在 JavaScript 中实现屏幕录制,可以使用 navigator.mediaDevices.getDisplayMedia() 方法来获取屏幕的媒体流。然后,可使用 MediaRecorder 对象将媒体流录制为视频文件。

但该方法会在浏览器弹出一个授权窗口,让用户选择要分享的内容,这不可实现“无感知”。

记录--纯前端也可以实现「用户无感知录屏」

如果真正做到无感知,那我们就不能借助浏览器或者系统系统的能力了。我们能做的就只能是通过js去操作了。

要在页面内直接录制视频似乎并不容易,没有现成的开源库可以使用,也没有很好的想法。

那我们换一个思路,视频是由帧组成的,我们是否可以不断的截图,然后组合成一段视频?好像是可以的

记录--纯前端也可以实现「用户无感知录屏」

页面

先写一个简单的页面:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Canvas视频录制</title>
    <link rel="stylesheet" href="styles.css">
</head>

<body>
    <main>
        <div class="buttons">
            <button class="start-btn">开始录制</button>
            <button class="pause-btn">暂停录制</button>
            <button class="resume-btn">继续录制</button>
            <button class="stop-btn">结束录制</button>
        </div>
        <div id="box">
            <section class="content">
                <h2>TODO LIST</h2>
                <div class="background-div">
                    <button class="background-btn">切换背景颜色</button>
                </div>
                <div id="todo-form">
                    <input type="text" class="input-field" placeholder="输入待办事项">
                    <button type="submit" class="submit-btn">提交</button>
                </div>
                <div class="list"></div>
            </section>
        </div>
        <img src="" alt="" class="hidden">
    </main>

    <script src="<https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js>" defer></script>
    <script src="canvas.js" defer></script>
</body>

</html>

截图

实现网页的截图操作,最常用的库是 html2canvas用,它可以将网页中的 HTML 元素转换为 Canvas 元素,并将其导出为图像文件。在浏览器中捕获整个页面或特定区域的截图,包括 CSS 样式和渲染效果。

const canvasFunction = () => {
    html2canvas(box).then(canvas => {
        const imgStr = canvas.toDataURL("image/png");
        img.src = imgStr;
        img.onload = function () {
            ctx.drawImage(img, 0, 0, w, h);
        }
    });
  }

合成视频

这里我们要使用到一个 API MediaRecorder ,用于在浏览器中进行音频和视频的录制。它提供了一种简单的方式来捕获来自麦克风、摄像头或屏幕的媒体数据,并将其保存为文件或进行实时流传输。

它有以下几个常用的方法:

  • isTypeSupported() 返回一个 Boolean 值,来表示设置的 MIME type 是否被当前用户的设备支持。
  • start() 开始录制媒体,这个方法调用时可以通过给 timeslice 参数设置一个毫秒值,如果设置这个毫秒值,那么录制的媒体会按照你设置的值进行分割成一个个单独的区块,而不是以默认的方式录制一个非常大的整块内容。
  • pause() 暂停媒体录制。
  • resume() 继续录制之前被暂停的录制动作。
  • stop() 停止录制。同时触发 dataavailable 事件,返回一个存储 Blob 内容的录制数据。之后不再记录。

首先创建一个 canvas 元素,用来保存 html2canvas 的截图,然后通过 captureStream 方法实时截取媒体流。

const w = boxBoundingClientRect.width;
const h = boxBoundingClientRect.height;
const canvas = document.createElement('canvas');
canvas.setAttribute('id', 'canvas');
canvas.setAttribute('width', w);
canvas.setAttribute('height', h);
canvas.style.display = 'none';
box.appendChild(canvas);

const img = document.querySelector('img');
const ctx = canvas.getContext("2d");
const allChunks = [];
const stream = canvas.captureStream(60); // 60 FPS recording   1秒60帧
通过 canvas 的流来创建一个 MediaRecorder 实例,并在 ondataavailable 事件中保存视频信息:
const recorder = new MediaRecorder(stream, {
    mimeType: 'video/webm;codecs=vp9'
});

recorder.ondataavailable = (e) => {
    allChunks.push(e.data);
};

最后,在停止录制时将帧信息创建 blob 并插入到页面上:

recorder.stop();
const fullBlob = new Blob(allChunks);
const videoUrl = window.URL.createObjectURL(fullBlob);

const video = document.createElement('video');
video.controls = true;
video.src = videoUrl;
video.muted = true;
video.autoplay = true;
document.body.appendChild(video);

或者可以将视频下载

recorder.stop();
const fullBlob = new Blob(allChunks);
const videoUrl = window.URL.createObjectURL(fullBlob);

let link = document.createElement('a');
link.style.display = 'none';
let fullBlob = new Blob(allChunks);
let downloadUrl = window.URL.createObjectURL(fullBlob);
link.href = downloadUrl;
link.download = 'canvas-video.mp4';
document.body.appendChild(link);
link.click();
link.remove();

这里,为了节省资源,只在点击按钮、输入等事件发生时才调用 html2canvas 截图 DOM。

如果实时记录屏也可以使用 requestAnimationFrame 。

最后

虽然实现了无感知录制屏幕,但也仅限于网页内,没有办法录制网页以外的部分。

本文转载于:

https://juejin.cn/post/7293462197386592283

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

 记录--纯前端也可以实现「用户无感知录屏」文章来源地址https://www.toymoban.com/news/detail-711149.html

到了这里,关于记录--纯前端也可以实现「用户无感知录屏」的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 红米手机录屏功能在哪?这里有你想要的答案

    “有人知道红米手机录屏功能在哪吗?刚买了最新款的红米K70,本来打算用来录制游戏,可是找了半天,就是没看见录屏功能,真的很着急,有没有大佬教教我。” 在手机成为人们生活不可或缺的一部分的今天,录屏功能逐渐成为了手机的标配之一。红米手机作为一款性价比

    2024年01月21日
    浏览(48)
  • 前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

    当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。 vue、js、webpack 编译项目时动态生成一个记录版本号的文件 轮询(20s、自己设定时间)这个文件,判断版

    2024年02月02日
    浏览(64)
  • 记录--前端中 JS 发起的请求可以暂停吗

    在前端中,JavaScript(JS)可以使用XMLHttpRequest对象或fetch API来发起网络请求。然而,JavaScript本身并没有提供直接的方法来暂停请求的执行。一旦请求被发送,它会继续执行并等待响应。 尽管如此,你可以通过一些技巧或库来模拟请求的暂停和继续执行。下面是一种常见的方法

    2024年02月05日
    浏览(38)
  • 记录--前端重新部署如何通知用户

    前端构建完上线,用户还停留还在老页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能。 每次打包写入一个json文件,或者对比生成的 script的src引入的hash地址或者etag 不同,轮询调用,判断是否更新 前端使用

    2024年02月14日
    浏览(42)
  • AIGC图像分辨率太低?快来试试像素感知扩散超分模型,你想要的细节都在这里

           最新 FaceChain支持多人合照写真、上百种单人写真风格,项目信息汇总:ModelScope 魔搭社区 。        github开源直达(觉得有趣的点个star哈。):GitHub - modelscope/facechain: FaceChain is a deep-learning toolchain for generating your Digital-Twin. 摘要 阿里巴巴最新自研的像素感知扩散

    2024年02月08日
    浏览(38)
  • 使用JavaScript实现保存文件,用户可以自己选择本地路径

    但是,此API目前仍处于实验阶段,可能并不在所有浏览器中都得到完全支持。 浏览器的权限是很低的,是不能与操作系统实现交互,只有少量的api可以与操作系统交互,例如文件上传。但是,软件是有很高的权限的,例如,迅雷下载就可以轻松实现,下载到指定目录。 但是

    2024年02月03日
    浏览(58)
  • 微信小程序的订阅消息是一个允许开发者向用户发送重要通知的功能。这里为您展示如何实现小程序订阅消息的基本步骤和代码示例

    步骤 1: 获取模板 ID 首先,您需要登录微信公众平台,进入「小程序管理」后台,找到“设置” “开发设置” “订阅消息”,然后选择并配置所需的模板,记录模板 ID。 步骤 2: 小程序前端请求订阅 在小程序的某个页面或组件中,当用户执行某个操作(例如点击按钮)时,可

    2024年02月04日
    浏览(94)
  • Android App保护用户隐私————禁止应用截屏或录屏

           相信大家在使用某些平台应用的时候,都会有 限制的规定 。        通常情况下,录屏、截图软件都可以在手机的运行过程中进行录屏、截图,普通的平台也不会阻止录屏、截图软件运行。        但是在某些比较 敏感 的平台上面,有可能出于 保密 的原因

    2024年02月02日
    浏览(78)
  • 实现用户操作日志记录

    java自带的日志框架是java.util.logging(JUL),从JDK1.4(2002)开始捆绑在JDK中。可以使用JUL来记录操作日志。以下是使用JUL记录事务的示例: 系统日志 :统日志主要是为开发排查问题提供依据,一般打印在日志文件中;系统日志的可读性要求没那么高,日志中会包含代码的信息

    2024年02月15日
    浏览(40)
  • 想解锁禁用的iPhone?除了可以使用电脑之外,这里还有不需要电脑的方法!

    多次输入错误的密码后,iPhone将显示“iPhone已禁用”。这种情况看起来很棘手,因为你现在不能用iPhone做任何事情。对于这种情况,我们提供了几种有效的方法来帮助你在最棘手的问题中解锁禁用的iPhone。你可以选择使用或不使用电脑来解锁禁用的iPhone。 iPhone的屏幕密码保护

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包