当前位置: 首页 > news >正文

js录制屏幕并输出视频

借助navigator,需要注意的是navigator.mediaDevices.getDisplayMedia需要在https使用,若部署环境为http,则会导致navigator.mediaDevices.getDisplayMedia为undefined
参数中的name为输出视频的文件名
time为录制的时长,若时长为一秒则time值为1000

async startScreenRecording (name, time) {// 根据漫游时长 结束录制const timer = setTimeout(() => {this.stopRecording()clearTimeout(timer)}, time)const self = thisif (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {await navigator.mediaDevices.getDisplayMedia({ video: true }).then((screenStream) => {self.screenStream = screenStreamconst canvasStream = document.getElementsByTagName('canvas')[0].captureStream()self.combinedStream = new MediaStream([...canvasStream.getVideoTracks(), ...screenStream.getAudioTracks()])self.mediaRecorder = new MediaRecorder(self.combinedStream, { mimeType: 'video/webm' })//// 获取录制的媒体资源const recordedChunks = []self.mediaRecorder.ondataavailable = (event) => {if (event.data.size > 0) {recordedChunks.push(event.data)}}self.mediaRecorder.onstop = () => {const videoBlob = new Blob(recordedChunks, { type: 'video/mp4' })// video/mp4 video/webm 下载mp4类型const videoUrl = URL.createObjectURL(videoBlob)// console.log('测试videoUrl', videoUrl)// self.$refs.video.src = videoUrlconst a = document.createElement('a')a.href = videoUrla.download = namea.click()a.remove()}self.mediaRecorder.start()self.recording = true}).catch(err => {this.$message({message: '无法访问屏幕内容:',type: 'warning'})console.error('无法访问屏幕内容:', err)})} else {this.$message({message: '浏览器不支持捕获屏幕内容',type: 'warning'})// this.imgToVideo()}// getDisplayMedia 获取屏幕媒体流},stopRecording () {this.mediaRecorder.stop()this.recording = falsethis.screenStream.getTracks().forEach((track) => track.stop())},

在http中可使用的录屏

canvasToVideo (name, time) {const timer = setTimeout(() => {this.mediaRecorder1.stop()this.recording = falseclearTimeout(timer)}, time)try {// 使用 html2canvas 将页面转换为画布// const stream = html2canvas(document.body).then((canvas) => {//   canvas.id = 'myCanvas' // 为画布设置一个 ID,以便稍后在 MediaRecorder API 中使用//   document.body.appendChild(canvas) // 将画布添加到页面中//   return canvas.captureStream() // 捕获画布的媒体内容// })const stream = document.getElementsByTagName('canvas')[0].captureStream()this.recordedBlobs = [] // 清空已录制的数据this.mediaRecorder1 = new MediaRecorder(stream) // 创建 MediaRecorder 实例this.mediaRecorder1.ondataavailable = (event) => {if (event.data && event.data.size > 0) {this.recordedBlobs.push(event.data) // 将录制的数据添加到数组中}}this.mediaRecorder1.start() // 开始录制this.recording = true// 当录制停止时,生成并下载录屏文件this.mediaRecorder1.onstop = () => {//创建一个新的 Blob 对象,包含所有录制的数据const videoBlob = new Blob(this.recordedBlobs, { type: 'video/mp4' })// video/mp4 video/webm 下载mp4类型const videoUrl = URL.createObjectURL(videoBlob)const a = document.createElement('a')a.href = videoUrla.download = namea.click()a.remove()}} catch (error) {console.error('Error:', error) // 如果发生错误,打印错误信息到控制台}},```
http://www.lryc.cn/news/188298.html

相关文章:

  • 华为OD机试 - 数组组成的最小数字(Java 2023 B卷 100分)
  • 数据结构-顺序存储二叉树
  • mysql学习实践
  • 键盘控制应用--通过键盘发送控制指令
  • python中pytorch的广播机制——Broadcasting
  • 基于BES平台音乐信号处理之DRC算法实现
  • 如何加快香山处理器Chisel->Verilog编译速度
  • pillow篇---pillow连续打开同一张图片会导致打开失败问题
  • 详细解说iptables 高阶用法,用来完成哪些高效率网络路由策略场景,iptables 实现域名过滤,Linux如何利用iptables屏蔽某些域名?
  • 面试总结-Redis篇章(十二)——Redis是单线程的,为什么还那么快
  • 5.编写程序 超强力方法
  • 超详细DeepLabv3 介绍与使用指南 – 使用 PyTorch 推理
  • 移动应用-Android-开发指南
  • 免费开源的非标项目型制造BOM一键导入方案介绍
  • 用合成数据训练车辆姿态估计神经网络
  • 【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件
  • 爬取微博热榜并将其存储为csv文件
  • 国庆中秋特辑(八)Spring Boot项目如何使用JPA
  • 用jad反编译工具查看java接口相关的默认修饰符
  • axios的get请求时数组参数没有下标
  • bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)
  • 一文告知HTTP GET是否可以有请求体
  • 防止SQL注入攻击的综合解决方案
  • MapReduce(林子雨慕课课程)
  • PHP聊天系统源码 在线聊天系统网站源码 后台自适应PC与移动端
  • 算法题:买卖股票的最佳时机 II (贪心算法解决股票问题)
  • Redis-持久化机制
  • 【LeetCode热题100】--155.最小栈
  • Allegro 17.2如何直接更新元件封装?
  • 高效数据管理:Java助力实现Excel数据验证