纯js实现录屏并保存视频到本地的尝试

前言:先了解下: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();
});

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

  • dataavailable 事件的监听器。当 MediaRecorder 有可用的音频/视频数据块时,它会触发此事件。在这里,每当数据可用时,将数据块(e.data)添加到 chunks 数组中。这是为了在录制完成后将这些数据块合并成一个完整的媒体文件。

  • stop 事件的监听器。当录制停止时,MediaRecorder 会触发此事件。

  • const blob = new Blob(chunks, { type: chunks[0].type });:使用 Blob 构造函数将 chunks 数组中的数据块合并成一个二进制对象(Blob 对象)。chunks[0].type 用于指定 Blob 的媒体类型,通常是 WebM。

  • const url = URL.createObjectURL(blob);使用 URL.createObjectURL 方法将 Blob 对象转换为一个临时 URL。这个 URL 可以用于创建下载链接。通过这个 url 传递给新创建的 a 元素用于下载功能。

  • 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 代码修改一下,然后直接复制粘贴到控制台上,并点击页面,如下所示:

diff

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

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

	const body = document.body;body.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.mp4";a.click();});mediaRecorder.start();});

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/211395.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫-某公开数据网站实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 此网站没有技巧的加密&#xff0c;仅是需要携带cookie和请求…

万界星空科技灯具行业MES介绍

中国是LED照明产品最大的生产制造国&#xff0c;如今&#xff0c;我国初步形成了包括LED外延片的生产、LED芯片的制备、LED芯片的封装以及LED产品应用在内的较为完超为产业链&#xff0c;随着LED照明市场渗诱率的快速警升&#xff0c;LED下游应用市场将会越来越广阔。这也将推动…

智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.寄生捕食算法4.实验参数设定5.算法结果6.参考…

3 测试驱动的Spring Boot应用程序开发数据层示例

文章目录 用户故事数据模型选择数据库SQL与NoSQLH2、Hibernate和JPA Spring Boot Data JPA依赖关系和自动配置Spring Data JPA技术栈数据源&#xff08;自动&#xff09;配置 实体存储库存储User和ChallengeAttempt显示最近的ChallengeAttempt服务层控制器层用户界面 小结 文章…

【JS】检索树结构,并返回结果节点的路径与子节点

【JS】检索树结构&#xff0c;并返回结果节点的路径与子节点 需求代码效果展示 需求 一个树结构&#xff0c;需要添加条件检索功能&#xff0c;检索结果依然是一个树结构&#xff0c;包含所有的符合要求的节点&#xff0c;以及他们到根节点的路径&#xff0c;与他们的子节点 …

vue项目运行时,报错:ValidationError: webpack Dev Server Invalid Options

在运行vue项目中&#xff0c;遇到报错&#xff1a;ValidationError: webpack Dev Server Invalid Options&#xff0c;如下图截图&#xff1a; 主要由于vue.config.js配置文件错误导致的&#xff0c;具体定位到proxy配置代理不能为空&#xff0c;导致运行项目报错&#xff0c;需…

版本控制系统Git学习笔记-Git基本知识介绍

目录 前言一、版本控制系统1.1 什么是版本控制系统1.2 本地版本控制系统1.3 集中化的版本控制系统1.3 分布式版本控制系统 二、Git简介2.1 数据处理方式2.2 几个特点2.2.1 几乎所有操作都是本地执行2.2.2 Git保证完整性2.2.3 Git一般只添加数据 2.3 Git中文件状态2.3.1 三种文件…

python networkx 网络展示的代码

1、创建一个无权重的图&#xff0c;并展示 edge_list.csv a,b,2 a,c,3 b,c,3 d,e,1 d,f,3 e,k,1 r,l,3 t,l,2import networkx as nx import matplotlib.pyplot as plt G nx.Graph() # 创建无向图 with open(edge_list.csv) as f:for line in f:edge line.strip().split(,)tr…

装修流程篇

装修流程 https://www.xiaohongshu.com/explore/627ba70d00000000210357b3 https://www.xiaohongshu.com/explore/63b6bc0c000000002203776f 半包装修流程 https://www.xiaohongshu.com/explore/64e5ea3b0000000003021711 户型图 效果 https://www.xiaohongshu.com/ex…

掌握大型语言模型(LLM)技术:推理优化

原文链接&#xff1a;Mastering LLM Techniques: Inference Optimization | NVIDIA Technical Blog 大模型相关技术文章已整理到Github仓库&#xff0c;欢迎start! 堆叠Transformer层以创建大型模型可以获得更好的准确性、few-shot学习能力&#xff0c;甚至在各种语言任务中具有…

三、Zookeeper数据模型

目录 1、Znode兼具文件和目录两种特点 2、Znode具有原子性操作

Ubuntu安装过程记录

软件准备 硬件 Acer电脑&#xff0c;AMD a6-440m芯片 64g优盘一个&#xff0c;实际就用了不到5g。 Ubuntu &#xff1a;官网 下载Ubuntu桌面系统 | Ubuntu 下载桌面版Ubuntu 22.04.3 LTS LTS属于稳定版 u盘系统盘制作软件 Rufus &#xff1a;Rufus - 轻松创建 USB 启动…

js模块化的应用!!!(前无古人,后无来者)

简介&#xff1a; 在 ES6 前&#xff0c; 实现模块化使用的是 RequireJS 或者 seaJS&#xff08;分别是基于 AMD 规范的模块化库&#xff0c; 和基于 CMD 规范的模块化库&#xff09;。 ES6 引入了模块化&#xff0c;其设计思想是在编译时就能确定模块的依赖关系&#xff0c…

万宾科技水环境综合治理监测系统的融合与应用

随着社会经济的快速发展&#xff0c;我国的水环境污染问题日益凸显&#xff0c;这不仅对生态环境造成了严重破坏&#xff0c;也严重威胁到人民群众的健康和生活质量。为了解决这一问题&#xff0c;城市生命线与水环境综合治理监测系统应运而生&#xff0c;二者的结合将为水环境…

gmid方法设计五管OTA二级远放

首先给出第一级是OTA&#xff0c;第二级是CS的二级运放电路图&#xff1a; gmid的设计方法可以根据GBW、Av、CL来进行电路设计&#xff0c;因此在设计电路之前需要以上的参数要求。 1、为了满足电路的相位裕度至少60&#xff0c;需要对GBW、主极点、零点进行分析。 首先给出其…

PMCW体制雷达系列文章(3) – PMCW雷达之匹配滤波

说明 PMCW体制下&#xff0c;雷达在接收端对接收的目标回波信号使用单频载波混频并低通滤波后&#xff0c;采集得到的是调制速率达ns量级的相位编码信号。在信号处理端&#xff0c;PMCW体制使用匹配滤波器(match filter)进行距离维的压缩&#xff0c;这是与FMCW体制雷达最核心的…

AntDesignBlazor示例——创建列表页

本示例是AntDesign Blazor的入门示例&#xff0c;在学习的同时分享出来&#xff0c;以供新手参考。 示例代码仓库&#xff1a;https://gitee.com/known/AntDesignDemo 1. 学习目标 使用Table组件创建列表页面使用DisplayName特性显示中文表头使用模板和Tag组件显示高温数据使…

EDW国际数据管理最新趋势(二)|信息供应链与数据

最近Data Fabric、Data Mesh、DataOps等话题非常火。其实&#xff0c;信息供应链谈的也是同样的东西&#xff0c;那就是如何将数据治理与数据集成整合在一起的解决方案。 下图虽然简单但涵盖了非常大的信息量。将4A架构进行了拆解&#xff0c;应用架构与技术架构主要是支撑业务…

R语言gWQS包在加权分位数和回归模型的应用

在流行病学研究中&#xff0c;相较于单一因素的暴露&#xff0c;多因素同时暴露的情况更为常见。传统模型在评价多因素联合暴露时存在数据维度高、多重共线性等问题. WQS 回归模型的基本原理是通过分位数间距及加权的方法&#xff0c;将多种研究因素的效应综合成为一个指数&…

openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复

文章目录 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复146.1 背景信息146.2 前置条件146.3 操作步骤146.4 示例 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复 146.1 背景信息 在openGauss使用过程中&#x…