首页 > 其他分享 >记录--纯前端也可以实现「用户无感知录屏」

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

时间:2023-10-25 19:11:51浏览次数:31  
标签:canvas const -- 录制 录屏 video fullBlob link 感知

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

前言

要在 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

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

 

标签:canvas,const,--,录制,录屏,video,fullBlob,link,感知
From: https://www.cnblogs.com/smileZAZ/p/17787926.html

相关文章

  • mosquitto(MQTT)服务器搭建和基本使用
    一、安装搭建一个mqtt服务器,这里我们采用mosquitto1、下载地址:https://mosquitto.org/download/ 2、选择windows:https://mosquitto.org/files/binary/win64/mosquitto-2.0.18-install-windows-x64.exe 3、右键安装即可默认的安装路径在这里:C:\ProgramFiles\mosquitto......
  • 常用的响应状态码有哪些?
    1.1xx【临时响应】需要请求这继续发送。    100:继续请求。101:切换协议。2.2xx【成功】处理了请求。    200:处理成功。3.3xx【重定向】完成请求,需要进一步操作。    301:服务器地址更改。4.4xx【错误请求】客户端请求错误。 403:服务器拒绝请求。404:无法找到请......
  • Python 面向对象编程:类、对象、初始化和方法详解
    Python是一种面向对象的编程语言。在Python中,几乎所有东西都是对象,都具有其属性和方法。类似于对象构造函数或用于创建对象的“蓝图”的类。创建一个类要创建一个类,请使用关键字class:示例,创建一个名为MyClass的类,其中包含一个名为x的属性:classMyClass:x=5创......
  • MapReduce性能优化秘籍
    1.MapReduce跑的慢的原因MapReduce程序效率的瓶颈在于两点:计算机性能CPU、内存、磁盘、网络I/O操作数据倾斜map和reduce数设置不合理map运行时间太长,导致reduce等待过久小文件过多大量的不可分块的超大文件(例:通过gzip压缩后的文件)spill(溢写)次数过多merge(map端合并......
  • 大厂中年人的职场卑微:深圳大厂程序员,被裁后身背百万房贷
    前言在职场中,有许多中年人,他们承担着家庭、房贷、子女教育等沉重的责任。随着年龄的增长,也承受着更多的压力。尽管已经经历了职场的风风雨雨,但是在“中年人”的年纪,职场生活却是越来越卑微。职场生活中的卑微并不陌生,但在中年这个阶段,这种感觉似乎变得更加显著。一位曾经在深圳某大......
  • Storm集成 JDBC
    创建maven工程,pom文件如下:<dependencies> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <version>1.0.3</version> <scope>provided</scope> </dependency......
  • The Garbage Collection Handbook pdf电子版
    TheGarbageCollectionHandbookpdf电子版下载作者: RichardJones / AntonyHosking / EliotMoss出版年: 2011-8-17ISBN: 9781420082791连接提取码:2agb非常全面的介绍了垃圾收集的原理和设计,适合做这个方向研究和实现。读透这本书需要时间。将自动内存管理技术分门别类......
  • 3.3 Tessellation Shader (TESS) & Geometry Shader(GS)
    一、曲面细分着色器的应用海浪,雪地等与置换贴图的结合二、几何着色器的应用几何动画草地等(与曲面着色器结合)三、着色器执行顺序1.TESS的输入与输出输入Patch,可以看成是多个顶点的集合,包含每个顶点的属性,可以指定一个Patch包含的顶点数以及自己的属性功能将图元细分(可以是三角形,矩形......
  • 二、深度测试(Z Test)
    1.是什么①从渲染管线出发②书面上理解所谓深度测试,就是针对当前对象在屏幕上(更准确的说是framebuffer)对应的像素点,讲对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象再改像素点才会将颜色写入颜色缓冲区,否则不会写入颜色缓冲区③逻辑上理解④从发展上理解2.......
  • 3.1 模板测试与深度测试(Stencil Test & Z Test)
    一、模板测试(StencilTest)模板测试可以实现的一些效果图1.是什么①从渲染管线出发:模板测试是在逐片源操作阶段,透明测试之后,深度测试之前的位置。②从书面概念上理解说到模板测试,就要先说道模板缓冲区。模板缓冲区与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保......