electron录制工具-desktopCapturer录屏

需求

录屏状态时,屏幕底部有个计时器,点击计时器停止录屏,跳转录屏结束的视频播放。

效果如下

electron-录屏演示

实现

计时器

创建一个浮窗,根据x、y坐标移动窗口的位置;

// 获取屏幕的主显示器信息const { width, height } = screen.getPrimaryDisplay().workAreaSize;// 设置窗口的宽度和高度const windowWidth = 120;const windowHeight = 120;// app.commandLine.appendSwitch('disable-features', 'IOSurfaceCapturer,DesktopCaptureMacV2')recordWin = new BrowserWindow({width: windowWidth,height: windowHeight,x: width / 2 - windowWidth / 2,y: height - windowHeight,frame: true, // 无边框transparent: true, // 透明窗口alwaysOnTop: true, // 窗口总是显示在最前面webPreferences: {preload: path.join(__dirname, 'preload.mjs'),},})

为了时间准确,使用时间戳计算录屏时长。

const updateDuration = () => {if (!recordRef.current.status) returnsetDuration(formatSecondsToHMS((new Date().getTime() - recordRef.current.startTime) / 1000))requestAnimationFrame(updateDuration)}

录屏

electron提供了desktopCapturer 共享屏幕接口,渲染进程通过 navigator.mediaDevices.getUserMediaMediaRecorder 结合获取录制屏幕的blob

// main.jsdesktopCapturer.getSources({ types: ['screen'] }).then(() => {recordWin?.webContents.send('start_record_main', 'screen:1:0')// 可以选择不同的窗口// for (const source of sources) {// 	if (source.name === 'Electron') {// 		maskWin?.webContents.send('SET_SOURCE', source.id)// 		return// 	}// }})
// render.jsconst mediaStream = await navigator.mediaDevices.getUserMedia({audio: false,video: {mandatory: {chromeMediaSource: 'desktop',chromeMediaSourceId: sourceId,}}})const options = { mimeType: 'video/webm; codecs=vp9' }; const mediaRecorder = new MediaRecorder(mediaStream, options);mediaRecorder.onstart = () => {recordRef.current.recordedChunks = [];recordRef.current.status = trueupdateDuration()}mediaRecorder.ondataavailable = function (event) {if (event.data.size > 0) {recordRef.current.recordedChunks.push(event.data);}};mediaRecorder.onstop = async () => {const blob = new Blob(recordRef.current.recordedChunks, { type: 'video/webm' });const url = URL.createObjectURL(blob);// downloadVideo(url);recordRef.current.recordedChunks = [];recordRef.current.status = falsewindow.ipcRenderer.send('stop_record_render', url)};mediaRecorder.onerror = (event) => {console.error("MediaRecorder error:", event);};mediaRecorder.start();

跳转视频编辑页面

	window.ipcRenderer.send('stop_record_render', url)

注:录屏也可以使用ffmpeg

代码

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

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

相关文章

AI服务器相关知识

在当今社会,人工智能的应用场景愈发广泛,如小爱同学、天猫精灵等 AI 服务已深入人们的生活。随着人工智能时代的来临,AI 服务器也开始在社会各行业发挥重要作用。那么,AI 服务器与传统服务器相比,究竟有何独特之处&…

ArcGIS要点和难点以及具体应用和优缺点介绍

ArcGIS是一款强大的地理信息系统(GIS)软件,广泛应用于各种领域,如城市规划、自然资源管理、环境保护、应急响应、地理科学研究和商业分析等。以下是对ArcGIS的详细介绍: 产品概述: ArcGIS提供了一个可伸缩的、全面的GIS平台,满足从桌面到服务器、野外和Web的各种GIS用户…

【docker】 pull access denied for alpine-java, repository does not exist

问题: com.spotify.docker.client.exceptions.DockerException: pull access denied for alpine-java, repository does not exist or may require docker login: denied: requested access to the resource is denied org.apache.maven.plugin.MojoExecutionExce…

Vue16-绑定class样式

一、vue绑定class样式 1-1、需求一:字符串写法 vue实现class样式绑定 1-2、需求二 点击div,随机切换样式。 math.random():随机数的范围[0, 1) 1-3、需求三:数组写法 样式的追加 1-4、需求四 :对象写法 二、vue绑定…

mqtt js同时监听多个topic

在mqttjs中,可以使用client.subscribe()方法订阅多个topic,然后使用client.on(message)监听所有订阅的topic的消息。以下是一个示例: javascript const mqtt require(mqtt); const client mqtt.connect(mqtt://test.mosquitto.org); clie…

椋鸟C++笔记#5:C++内存管理

文章目录 C语言中的动态内存管理C\\中的动态内存管理使用new/delete操作内置类型使用new/delete操作自定义类型operator new(operator new[])与operator delete(operator delete[])函数operator new函数operator delete函数operator new[]和operator delete[] new与delete的实现…

ref和out

学习ref和out的原因 它们可以解决在函数内部改变外部传入的内容,里面变了,外面也要改变。 static void ChangeValue(int value) {value 3; }static void ChangeArrayValue(int[] arr) {arr[0] 99; }static void ChangeArray(int[] arr) {//重新声明了…

linux centos consul1.15.2一键安装部署

consul原理、作用、安装相关内容 一、理论部分二、安装下载版本地址三、安装consul服务 一、理论部分 1、consul的原理 Consul的原理及作用可以归纳为以下几点: ①、基于Gossip协议的通信:Consul使用了基于Gossip协议的Serf实现来进行通信。 Gossip协议…

【DevOps】服务器硬件基础知识

目录 前言 1、处理器(CPU):服务器的“大脑” 2、内存(RAM):服务器的“工作台” 3、存储(Storage):服务器的“仓库” 4、 网络接口(NIC)&…

【教学类-64-03】20240611色块眼力挑战(三)-2-10宫格色差10-50(10倍)适合中班幼儿园(星火讯飞)

背景需求: 【教学类-64-02】20240610色块眼力挑战(二)-2-25宫格&色差10-100(10倍)(星火讯飞)-CSDN博客文章浏览阅读360次,点赞17次,收藏13次。【教学类-64-02】2024…

Warning: `ReactDOMTestUtils.act` is deprecated in favor of `React.act`.

问题:在代码中使用jest进行单元测试时,报错如下: 解决思路: 根据报错提示出来的 react-dom/test-utils 进行全局搜索,发现没有该引用,故进入该代码块中分析。发现代码中引入testing-library/react &#…

算法设计与分析(5题Python版)

1、阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N堆金币,第i堆金币的总重量和总价值分别是m,v。阿里巴巴有一个承重量为T的背包,但并不一定有办法将全部的金币都装进去。 他想装走尽可能多价值的金币,所有金币都可以随意分割,分…

【云岚到家】-day02-2-客户管理-认证授权

【云岚到家】-day02-2-客户管理-认证授权 第二章 客户管理1 认证模块1.1 需求分析1.2 小程序认证1.2.1 测试小程序认证1.2.1.1 参考官方流程1.2.1.2 申请小程序账号1.2.1.3 创建jzo2o-customer1.2.1.4 部署前端1.2.1.5 编译运行1.2.1.6 真机调试 2 阅读代码2.1 小程序认证流程2…

Qt——升级系列(Level Five):显示类控件、输入类控件、多元素控件、容器类控件、布局管理器

显示类控件 Label QLabel 可以⽤来显⽰⽂本和图⽚. 核⼼属性如下: 属性 说明 text QLabel 中的⽂本 textFormat ⽂本的格式. • Qt::PlainText 纯⽂本 • Qt::RichText 富⽂本(⽀持 html 标签) • Qt::MarkdownText markdown 格式 • Qt::AutoText 根…

Nginx配置详细解释:(4)高级配置

目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外,还有一些高级配置,如网页的状态,第三方模块需要另外安装,支持变量&#xff0c…

【C语言初阶】循环语句

🌟博主主页:我是一只海绵派大星 📚专栏分类:C语言 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、什么是循环语句 二、while语句 while语句中的break和continue break continue 三、for循环 break和continue在for循…

MAC安装idea教程

https://blog.csdn.net/qq_41810415/article/details/131649541 JDK安装 https://blog.csdn.net/dddebug/article/details/121713633 2、编辑.bash_profile文件 vim .bash_profile 进入编辑模式后 按 i 开始添加内容 结束编辑模式按 ESC 结束后保存输入 :wq! 不保存输入 :q! 检…

C++ - Clion安装Qt msvc2017版本教程,基础环境配置clion+ Qt5.12.12 msvc2017 + VS2019

背景:平时代码开发使用clion,但使用项目要制定mscv2017版本Qt。先装过mingw版本Qt无法运行,但msvc版本依赖装有Visual Studio,本地装的又是2019版。就出现了这个大坑,需要配置好clion Qt msvc2017 VS2019。 文章目录 …

【Git】Windows下使用可视化工具Sourcetree

参考:[最全面] SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR) 1.Git工具–sourcetree 之前文章介绍过Linux系统中的Git工具&…

Linux - 信号概念 信号产生

Linux - 信号概念 & 信号产生 信号概念信号产生软件信号killraiseabortalarm 硬件信号键盘产生信号硬件中断 信号概念 信号是进程之间事件异步通知的一种方式 在Linux命令行中,我们可以通过ctrl c来终止一个前台运行的进程,其实这就是一个发送信号的…