我定制了一个属于自己的录屏软件

news2024/9/24 6:20:51

相信很多朋友都用过不同软件的录屏功能,但是这些软件多少还让存在一些缺点,让我们在录屏的时候不能得心应手。

今天我就来手把手教大家自己来制作一个私人订制的浏览器录屏器,

录屏器

我们可以使用浏览器的屏幕捕获API接口来帮助我们来捕获我们的视频流。

  • 首先我们要创建一按钮来帮助我们触发我们的录屏功能
// 创建一个名为 button 的常量,该常量引用一个新创建的按钮元素
const button = document.createElement("button");

// 设置按钮的显示文本为 "开始录制"
button.innerHTML = "开始录制";

// 将按钮元素添加到文档的 body 元素中
document.body.append(button);

// 为按钮添加一个点击事件监听器
button.addEventListener("click", async () => {
  // 在按钮被点击时触发的异步函数

  // 添加我们的录屏代码,触发录屏API,以响应按钮点击事件
});

开始录屏
  • 当我们点击按钮后,我们需要进行录制屏幕,录制屏幕的前提是要先获取视频流(即我们视频的来源)之后才能进行录制,获取视频流我们可以使用 navigator.mediaDevices.getDisplayMedia() 方法可方便地请求并获取屏幕或应用程序窗口的媒体流。

  • 获取视频流后,我们需要对视频流进行录制,我们可以创建一个MediaRecorder 对象,它可以帮助对视频流进行录制。

// 使用 navigator.mediaDevices.getDisplayMedia() 获取屏幕共享的媒体流
const stream = await navigator.mediaDevices.getDisplayMedia();

// 创建一个 MediaRecorder 对象,用于录制媒体流
const recorder = new MediaRecorder(stream);

// 开始录制媒体流
recorder.start();

这样在点击我们的“开始录制”按钮后,就能开始录制我们的屏幕了。

录完视频后我们要怎么停止和下载保持呢?

停止录屏

image.png

  • 当我们录制完我们想要的视频时,我们需要停止录制器,并从媒体流中获取视频轨道。
  • 我们可以使用 navigator.mediaDevices.getDisplayMedia() 的 getVideoTracks() 方法,可以轻松获取到我们的视频轨道。
  • 此外,我们还可以添加一个监听器,以便在媒体播放完毕时停止录制器,确保录制操作跟随屏幕分享的结束而停止。
// 从媒体流中获取视频轨道
const [video] = stream.getVideoTracks();

// 为视频轨道添加 'ended' 事件监听器
video.addEventListener("ended", () => {
  // 当视频播放结束时触发的回调函数

  // 停止录制器(recorder)
  recorder.stop();
});

下载并保存视频

当我们停止录制的同时,希望能够保存我们的视频。

我们需要获取视频文件并下载,

我们可以监听录制器,当录制数据可用时,我们创建一个新的 <a> 元素,来创建下载链接,设置 <a>元素的 href 属性为录制数据的 Blob URL,同时我们可以模拟用户点击 <a> 元素,来触发下载操作。当然如果你想自己来触发也不是不行。看个人需求。最后我们的录屏视频就会被下载保存下来。

// 为录制器(recorder)添加 'dataavailable' 事件监听器
recorder.addEventListener("dataavailable", (evt) => {
  // 当录制数据可用时触发的回调函数

  // 创建一个新的 <a> 元素,用于创建下载链接
  const a = document.createElement("a");

  // 设置 <a> 元素的 href 属性为录制数据的 Blob URL
  a.href = URL.createObjectURL(evt.data);

  // 设置 <a> 元素的 download 属性,指定下载文件的名称为 "capture.webm"
  a.download = "屏幕录制.webm";

  // 模拟用户点击 <a> 元素,触发下载操作
  a.click();
});

jcode
点击右上角的码上掘金查看详细代码

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java里的序列化反序列化、HttpMessageConverter、Jackson、消息转化器、对象转化器...都是啥?

前段时间在学习SSM框架&#xff08;spring boot、spring MVC、mybatis&#xff09;后端项目的时候&#xff0c;发现他们的项目里&#xff1a;响应类Result类要实现Serializable接口、转化响应给前端的时间数据的格式要用到什么“消息转换器”MappingJackson2HttpMwssageConvert…

Vue:Vue3-TypeScript-Pinia-Vite-pnpm / 基础项目 / 20240807

一、项目技术栈 / 依赖 序号技术栈版本解释1node20.14.02vue 3.4.31 3vite 5.3.4 4TypeScript 5.2.2 5 types/node 22.0.2 解决TypeScript项目中缺少对应模块的类型定义文件的问题6 element-plus 2.7.8 ui组建7 types/js-cookie js-cookie 3.0.6 3.0.5 8 sass 1.77.8 9 hu…

zdppy+vue3+onlyoffice开发文档系统实战20240807上课笔记 解决了最近文档页面几个遗留的文档

小技巧 vite配置 open: true 可以自动打开浏览器。 目前 遗留任务 1、在名称前面&#xff0c;渲染这个文档的图标 2、大小的基本的单位是kb&#xff0c;超过1024kb则换成mb&#xff0c;主要是这两个单位 3、数据按照最近访问时间倒序 4、给文件名价格链接&#xff0c;实现和…

C语言深度剖析(部分)--剩下随缘更新

C语言深度剖析 关键字auto-最宽容大度的关键字 变量的分类 代码块&#xff1a;用{ }括起来的区域 局部变量&#xff1a;包含在代码块中的变量&#xff0c;局部变量具有临时性&#xff0c;进入代码块&#xff0c;自动形成局部变量&#xff0c;退出代码块自动释放。 全局变量…

鸿蒙AI功能开发【hiai引擎框架-人脸比对】 基础视觉服务

hiai引擎框架-人脸比对 介绍 本示例展示了使用hiai引擎框架提供的人脸比对能力。 本示例模拟了在应用里&#xff0c;选择两张图片&#xff0c;计算两个图中最大人脸的相似度 需要使用hiai引擎框架人脸比对接口hms.ai.face.faceComparator。 效果预览 使用说明&#xff1a;…

C++ STL专题 list的底层实现

目录 1.模拟实现list 2.节点模板讲解 3.迭代器模板讲解 3.1为什么template 有三个类型参数 (1).class T (2).class ref (3).class ptr 3.2 *重载 3.3 ->重载 3.4 前置和后置的重载 3.5 前置--和--后置的重载 3.6 和!的重载 4. list模板讲解 4.1 begin()函数 …

[译] How things get done on the Go Team

6天前&#xff0c;掌舵Go语言团队12年Rsc在golang-dev/群组发文宣布&#xff0c;将在9月1号后辞去当前职位&#xff0c;转去做 Gaby 和 Oscar. 这对于Go语言发展无疑是里程碑式的事件。 本篇内容是根据6月份他和另外两位同事参与Go Time音频录制内容的整理与翻译&#xff0c;英…

代码随想录算法训练营Day22 | Leetcode 77 组合 Leetcode 216 组合总和Ⅲ Leetcode17 电话号码的字母组合

前言 回溯算法中递归的逻辑不重要&#xff0c;只要掌握回溯的模板以及将问题转化为树形图&#xff0c;整个问题就很好解决了&#xff0c;比二叉树简单。 Leetcode 77 组合 题目链接&#xff1a;77. 组合 - 力扣&#xff08;LeetCode&#xff09; 代码随想录题解&#xff1a;…

K-means聚类算法的应用以及实现

K-means 聚类算法属于无监督学习&#xff0c;它会将相似的对象归到同一个簇中&#xff0c;该算法原理简单&#xff0c;执行效率高&#xff0c;并且容易实现&#xff0c;是解决聚类问题的经典算法。 尽管如此&#xff0c;任何一款算法都不可能做到完美无瑕&#xff0c;K-measn 算…

计算机毕业设计选题推荐-房屋租赁系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【python】python心理健康医学数据分析与逻辑回归预测(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

php 中 (0 == ‘abc‘) 为真

https://andi.cn/page/621653.html

第129天:内网安全-横向移动WmiSmbCrackMapExecProxyChainsImpacket

这里这个环境继续上一篇文章搭建的环境 案例一&#xff1a; 域横向移动-WMI-自带&命令&套件&插件 首先上线win2008 首先提权到system权限 wmic是windows自带的命令&#xff0c;可以通过135端口进行连接利用&#xff0c;只支持明文方式&#xff0c;优点是不用上传别…

解决IDEA中Maven项目依赖已存在但仍报找不到的错误

问题描述&#xff1a; 如图显示的是lombok存在 这里已经导入lombok依赖包 如图所示依赖包确实已经导入 解决方案&#xff1a; 点击后会重新启动项目&#xff0c;操作后我们重新配置一下maven 设置完后&#xff0c;点击重新引入就行

JAVA实战项目笔记02

一、新增员工 1.接口设计 2.设计数据库的employee表 3.设计DTO DTO&#xff1a;封装前端提交过来的数据 实体类如下&#xff1a;包含更多属性 public class Employee implements Serializable {private static final long serialVersionUID 1L;private Long id;private Str…

vivado OPT_SKIPPED

当跳过候选基元单元的逻辑优化时&#xff0c;OPT_skipped属性 更新单元格以反映跳过的优化。当跳过多个优化时 在同一单元格上&#xff0c;OPT_SKIPPED值包含跳过的优化列表。 架构支持 所有架构。 适用对象 OPT_SKIPPED属性放置在单元格上。 价值观 下表列出了各种OPT_design选…

使用ventoy制作U盘安装centos8

使用ventoy制作U盘安装centos8 参考&#xff1a;https://blog.51cto.com/u_14120/11118656 推荐这个https://www.zhihu.com/question/290783457/answer/3103388484 1、ventoy官网 https://www.ventoy.net/en/download.html 2、下载完成直接制作u盘启动盘 4、将下载iso镜像…

维特根斯坦:所谓天才,就是不放弃实践的勇气

天才并不比任何一个诚实的人有更多的光&#xff0c;但他有一个特殊的透镜&#xff0c;可以将光线聚焦至燃点。 我象一个骑在马上的拙劣骑手一样&#xff0c;骑在生活上。我之所以现在还未被抛下&#xff0c;仅仅归功于马的良好本性。 一个人懂得太多就会发现&#xff0c;要不…

大模型开源教程「动手学大模型应用开发」,从零基础到掌握大模型开发的关键技能!

LLM 正逐步成为信息世界的新革命力量&#xff0c;其通过强大的自然语言理解、自然语言生成能力&#xff0c;为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的 LLM API 服务开放&#xff0c;如何基于 LLM API 快速、便捷地开发具备更强能力、集成 LLM 的应用&…

营销材料翻译质量对销售渠道的影响

在当今的全球市场中&#xff0c;与不同受众进行有效沟通的能力对于企业的成功至关重要。营销材料的高质量翻译在通过销售渠道塑造客户旅程方面发挥着重要作用&#xff0c;影响着知名度、参与度、转化率和保留率。方法如下&#xff1a; 提高品牌知名度 在销售渠道的顶端&#x…