借助浏览器实现一个录屏插件?

说在前面

🎈不知道大家平时都是使用什么录屏软件呢?有没有想过只用JavaScript我们也可以快速实现一个录屏插件?

准备工作

开始写代码前我们需要先了解一下以下几点:

1、getDisplayMedia

navigator.mediaDevices.getDisplayMedia() 是一种基于Web的API,它允许网站在获得用户同意的情况下,捕获用户的屏幕或屏幕的特定部分作为媒体流。这个API是Media Capture and Streams API的一部分,通常用于实现屏幕共享功能,例如远程协作、视频会议或直播。

基本用法

getDisplayMedia() 方法返回一个Promise,该Promise解析为一个MediaStream对象,其中包含屏幕捕获的数据。使用此方法的基本步骤如下:

    1. 调用 getDisplayMedia() 并传入配置对象,指定所需的媒体类型和可选的约束条件。
    1. 处理Promise解析后的MediaStream对象,例如将其用作MediaRecorder的源或显示在<video>元素中。
if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
  const displayMediaOptions = {
    video: {
      cursor: "always" // 捕获鼠标指针
    },
    audio: false // 不捕获音频
  };

  navigator.mediaDevices.getDisplayMedia(displayMediaOptions)
    .then(stream => {
      // 屏幕捕获成功,'stream' 包含屏幕的媒体流
    })
    .catch(error => {
      // 捕获屏幕失败
      console.error("Error: ", error);
    });
}
重要特性
  • 用户授权:出于安全和隐私的考虑,浏览器要求用户明确授权才能进行屏幕捕获。
  • 异步操作getDisplayMedia() 是异步的,返回一个Promise对象。
  • 媒体类型:可以捕获视频和/或音频,具体取决于getDisplayMedia()调用中的配置选项。
  • 浏览器兼容性:不同的浏览器可能有不同的实现和支持程度,需要检查navigator.mediaDevices.getDisplayMedia是否存在。
安全和隐私
  • 屏幕捕获是一个敏感操作,因为它可能涉及到捕获用户的敏感信息。因此,浏览器会要求用户明确授权。
  • 网站在使用getDisplayMedia()时应该明确告知用户,并在获得用户同意后进行。
应用场景
  • 视频会议:用户可以共享他们的屏幕或应用程序窗口,以便在远程会议中展示内容。
  • 直播:游戏直播者可以共享他们的游戏画面。
  • 远程支持:技术支持人员可以请求访问用户的屏幕来帮助解决问题。

getDisplayMedia() 提供了一种强大的方式,允许Web应用以用户控制的方式捕获和使用屏幕内容。

2、快速开发一个插件

可以通过脚手架快速生成一个插件基本框架。

安装jyeontu脚手架
npm install jyeontu
使用脚手架快速创建新项目
jyeontu create

选择 Chrome 插件模板 即可

初始化
npm run init
打包
npm run build

插件开发

目标

  • 1、在浏览器中页面右键菜单加上开始录屏按钮

  • 2、点击开始录屏按钮后弹出新页面选择录取的屏幕

  • 3、结束录屏后输出视频文件

功能实现

1、浏览器右键菜单添加按钮
const id = "screenRecording"; //generateRandomString(8);
chrome.contextMenus.create({
  title: "开始录屏", //菜单的名称
  id: id, //一级菜单的id
  contexts: ["page"], // page表示页面右键就会有这个菜单,如果想要当选中文字时才会出现此右键菜单,用:selection
});

2、监听右键菜单点击事件

这里直接借用百度首页做个中间页面来触发录屏事件😀😀😀

chrome.contextMenus.onClicked.addListener((info, tab) => {
  if (info.menuItemId == id) {
    var createData = {
      url: "https://baidu.com?isStartMediaRecorder=1",
      // url: chrome.runtime.getURL("recorder.html"),
      type: "normal",
      top: 200,
      left: 300,
      width: 1300,
      height: 800,
    };
    // 创建(打开)一个新的浏览器窗口,可以提供大小、位置或默认 URL 等可选参数
    chrome.windows.create(createData);
  }
});
3、判断是否录屏弹窗

直接判断路径参数isStartMediaRecorder即可

localStorage.setItem("isMediaRecorderEnd", false);
const url = new URL(location.href);
const isStartMediaRecorder = url.searchParams.get("isStartMediaRecorder");
if (isStartMediaRecorder) {
  document.body.style.display = "flex";
  document.body.innerHTML = `<div
    style="
      font-size: large;
      margin: auto;
      font-weight: bold;
      text-align: center;
    "
  >
    录制中
  </div>`;
  startMediaRecorder();
}
4、开始录屏
function startRecorder(stream) {
  var mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9")
    ? "video/webm; codecs=vp9"
    : "video/webm";
  var mediaRecorder = new MediaRecorder(stream, { mimeType: mime }); // 录制

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

  // 监听用户取消屏幕共享
  stream.getTracks().forEach((track) => {
    track.addEventListener("ended", function (e) {
      console.log("轨道结束: ", e);
      // 用户取消屏幕共享,执行清理操作
      mediaRecorder.stop(); // 停止录制
    });
  });

  mediaRecorder.start(); // 手动启动录制
}
function startMediaRecorder() {
  navigator.mediaDevices
    .getDisplayMedia({
      video: true,
    })
    .then((stream) => {
      startRecorder(stream);
    })
    .catch((err) => {
      console.warn(err);
      localStorage.setItem("isMediaRecorderEnd", true);
    });
}
5、录屏结束

监听录屏结束事件,并使用a标签将录制视频下载到本地。

function getFormattedCurrentTime() {
  const now = new Date(); // 获取当前时间
  const year = now.getFullYear(); // 年份
  const month = (now.getMonth() + 1).toString().padStart(2, "0"); // 月份,加1因为月份是从0开始的
  const day = now.getDate().toString().padStart(2, "0"); // 日期
  const hours = now.getHours().toString().padStart(2, "0"); // 小时
  const minutes = now.getMinutes().toString().padStart(2, "0"); // 分钟
  const seconds = now.getSeconds().toString().padStart(2, "0"); // 秒
  return `${year}${month}${day}${hours}${minutes}${seconds}`;
}

mediaRecorder.addEventListener("stop", function () {
  var blob = new Blob(chunks, { type: "video/webm" }); // 确保Blob的MIME类型正确
  var url = URL.createObjectURL(blob);
  var a = document.createElement("a");
  a.href = url;
  a.download = getFormattedCurrentTime() + "-video.webm";
  a.click();
  setTimeout(() => {
    localStorage.setItem("isMediaRecorderEnd", true);
  }, 200);
});

插件使用

下载

下载地址:https://gitee.com/zheng_yongtao/chrome-plug-in/blob/master/screenRecording/screenRecording.zip

安装

下载解压后导入chrome:chrome://extensions/

选择解压后的文件夹即可

源码

🔎源码地址:https://gitee.com/zheng_yongtao/chrome-plug-in/tree/master/screenRecording

⭐⭐⭐欢迎star⭐⭐⭐

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】AVL树/红黑树实现及map与set的封装

前言 【C】二叉树进阶&#xff08;二叉搜索树&#xff09; 这篇文章讲述了关于二叉搜索树知识&#xff0c;但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度会退化成O(N)&#xff…

充电学习——0、电源管理

一、设备电源管理&#xff1a; 两种类型 1、系统睡眠模型&#xff1a; 设备驱动作为系统一部分&#xff0c;会跟随系统进入低功耗状态&#xff0c;suspend &#xff08;suspend-to-ram&#xff09; 一些驱动程序可以管理硬件的唤醒事件&#xff0c; 这一特性通过/sys/device/…

图像处理与视觉感知复习--彩色图像处理

文章目录 三原色原理及其两种应用常用彩色模型及其应用领域各种颜色模型的转换彩色图像处理 三原色原理及其两种应用 三基色原理 自然界中绝大多数的颜色都可看作是由红、绿、蓝三种颜色组合而成&#xff1b;自然界中的绝大多数的颜色都可以分解成红、绿、蓝这三种颜色。这即…

minIo ubuntu单节点部署

资源准备 minio二进制包 下载地址:https://dl.min.io/server/minio/release/linux-amd64/minio ubuntu-单节点部署 选择一台ubuntu18.04机器10.253.9.41、intel 或者 amd 64位处理器 上传minio到~目录 sudo cp minio /usr/local/bin/ sudo chmod x /usr/local/bin/minio 设…

Vue3+ECharts

Vue3 Echarts 在Vue3中使用Echarts V5.5.0时&#xff0c;报错如下&#xff1a; 在Vue3中&#xff0c;初始化echarts实例时&#xff0c;会将echarts实例对象转换成响应式对象&#xff0c;从而在resize时无法获取需要的数据。 此时需要使用 markRaw() 将echarts实例对象转换成…

团结的力量:友情、互助与感恩

时间如白驹过隙&#xff0c;半载光阴转瞬即逝。回首过去的六个月&#xff0c;在CSDN平台上&#xff0c;我经历了无数的挑战和成长。在大厂和阿豪的帮助下&#xff0c;我的粉丝数终于突破了万大关。这不仅是我个人的成就&#xff0c;更是我们团结、互助和感恩精神的见证。 初识…

力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 521.最长特殊序列 I【简单】 题目&#xff1a; 给你两个字符串 a 和 b&am…

人民日报:高考填志愿十问十答,填报志愿时需要考虑哪些因素?

高考结束&#xff0c;志愿填报即将开始&#xff0c;填报志愿时需要考虑哪些因素&#xff1f;如何避免高分低录甚至落榜&#xff1f;高考填志愿你需要知道的事↓↓ 祝福考生考入理想大学、就读喜欢的专业。加油&#xff01; 责任编辑&#xff1a;曹继炜

Attention机制到底是什么?

AI算法之一 的Attention机制到底是什么&#xff0c;你知道吗? 这里写目录标题 1. Attention 的本质2. Attention的3大优点3. Attention的原理3.Attention的类型3.1计算区域3.2 所用信息3.3 结构层次 4. 模型方面5. 相似度计算 1. Attention 的本质 Attention&#xff08;注意…

hive on spark 记录

环境&#xff1a; hadoop 2.7.2 spark-without-hadoop 2.4.6 hive 2.3.4 hive-site.xml <property><name>hive.execution.engine</name><value>spark</value> </property> <property><name>spark.yarn.jars</name>&l…

ETAS AUTOSAR工具链的作用

一、AUTOSAR是什么&#xff1f; AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;是一个全球性的联盟&#xff0c;致力于制定和推广汽车电子系统的标准化解决方案。它是由汽车制造商、供应商和工程公司组成的合作伙伴网络&#xff0c;旨在解决汽车电子系统…

[Qt的学习日常]--常用控件2

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、widget的…

U盘文件夹变exe:现象解析与数据恢复策略

一、U盘文件夹变exe现象描述 在日常使用U盘进行数据传输和存储的过程中&#xff0c;部分用户可能会遭遇一种异常现象&#xff1a;原本正常的文件夹突然变成了可执行文件&#xff08;即后缀为.exe的文件&#xff09;。这种变化不仅影响了用户对文件的正常访问和管理&#xff0c…

基于文本和图片输入的3D数字人化身生成技术解析

随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…

短剧系统搭建全攻略:功能齐全,一步到位

前言 近年来&#xff0c;短剧系统以其独特魅力&#xff0c;成为大众消遣娱乐的热门选择。简单来说&#xff0c;短剧系统就是用来看短剧的小程序&#xff0c;它汇集了丰富多彩的短剧资源&#xff0c;让观众随时随地享受观影乐趣。本文将为你详细解析短剧系统的搭建全攻略&#…

GaussDB技术解读——GaussDB架构介绍(四)

目录 11 GaussDB云原生架构 11.1 云原生关键技术架构 11.2 关键技术方案 11.2.1 通信组件 11.2.2 集群管理组件 11.2.3 多租组件 GaussDB架构介绍&#xff08;三&#xff09;从智能关键技术方案、驱动接口关键技术方案等方面对GaussDB架构进行了解读&#xff0c;本篇将…

SpringBoot配置第三方专业缓存技术Memcached 下载 安装 整合测试 2024年5000字详解

Memcached下载和安装 是一个国内使用量还是比较大的技术 打开文件夹 我们需要在命令行窗口启动 注意要以管理员方式运行 先尝试进入指定文件 然后又再次运行 下载 memcached.exe -d install 启动 memcached.exe -d start 停止 memcached.exe -d stop memcached.exe -d i…

直播中的美颜技术详解:视频美颜SDK的开发与应用

今天&#xff0c;笔者将深入探讨直播中的美颜技术&#xff0c;解析视频美颜SDK的开发与应用。 一、视频美颜技术概述 视频美颜技术主要通过实时处理视频流&#xff0c;对人脸进行优化和修饰&#xff0c;使直播画面更加美观。这些功能不仅提升了用户的直播体验&#xff0c;还极…

程序员的悲哀是什么?

说在前面 在许多人眼中&#xff0c;程序员无疑是一份令人羡慕的职业。然而&#xff0c;这份工作背后隐藏的辛酸与挑战&#xff0c;却鲜为人知。技术的迅猛发展带来了持续的学习压力&#xff0c;孤独的编码长夜挑战着程序员的社交与情感需求。高强度的工作节奏和严苛的项目期限…

视觉应用线扫相机速度反馈(伺服转盘)

运动控制实时总线相关内容请参考运动控制专栏&#xff0c;这里不再赘述 1、运动控制常用单位u/s运动控制单位[u/s]介绍_运动控制 unit是什么单位-CSDN博客文章浏览阅读176次。运动控制很多手册上会写这样的单位&#xff0c;这里的u是英文单词unit的缩写&#xff0c;也就是单位…