rrweb原理

rrweb 是一个实现web页面录制和回放的基础库 ,它可以将⻚⾯中的 DOM 以及⽤户操作保存为可序列化的数据,以实现远程回放。

RecordRTC原理

1.rrweb

安装npm i rrweb

直接上代码

<template><el-card shadow="never" class="aui-card--fill"><div class="rrweb-create"><el-button @click="crateWeb">开始录制</el-button><el-button @click="saveWeb">保存录制</el-button><el-button @click="getInfo">回放录屏</el-button></div><div id="replaycontent" style="width: 1000px;height: 500px;background-color: #cccccc"></div></el-card>
</template>
<script>
import { record } from 'rrweb'
import 'rrweb-player/dist/style.css'
import rrwebPlayer from 'rrweb-player'
export default {name: 'Rrweb',components: {},data () {return {events: []}},props: {},watch: {},methods: {// 开始录屏crateWeb () {const _this = this_this.events = []record({emit (event) {// 用任意方式存储 event_this.events.push(event)_this.$store.commit('getEvents', _this.events)}})},// 保存录屏saveWeb () {// console.log(this.events)// this.$http.post('/record/create/setCreate', {//   events: this.events// }).then(({ data: res }) => {//   this.crateWeb()// }).catch(() => {//   this.crateWeb()// })},// 回放录屏getInfo () {console.log(this.$store.state.events)var events = this.$store.state.events// this.$http.get('/record/create/getInfo', {//   params: {//     id: 18//   }// }).then(({ data: res }) => {//   const events = JSON.parse(res.data.events)// eslint-disable-next-line no-new,new-capnew rrwebPlayer({target: document.getElementById('replaycontent'),data: {events}})// }).catch(() => {//   this.crateWeb()// })}},computed: {},created () {},mounted () {}
}
</script>
<style lang="scss" scoped>
</style>

效果:

2.RecordRTC

npm i rrweb

npm i rrweb-player

直接上代码

<template><div class="record-page"><div style="margin-bottom: 15px;"><el-button @click="startRecording" :disabled="videoStart" size="small">开始录制</el-button><el-button @click="stopRecording" :disabled="!videoStart" size="small" id="btn-stop-recording">结束录制</el-button></div><video controls autoplay playsinline ref="video" width="400" height="300"></video></div>
</template><script>
import RecordRTC from 'recordrtc'
export default {name: 'screenRecord',data () {return {video: null,videoStart: false,recorder: null}},created () {console.log(navigator.getDisplayMedia)if (!navigator.getDisplayMedia && !navigator.mediaDevices.getDisplayMedia) {const error = 'Your browser does NOT support the getDisplayMedia API.'throw new Error(error)}},mounted () {this.video = document.querySelector('video')},methods: {// 调用获取显示媒体invokeGetDisplayMedia (success, error) {const displaymediastreamconstraints = {video: {displaySurface: 'window', // monitor, window, application, browserlogicalSurface: false,cursor: 'always' // never, always, motion}}// above constraints are NOT supported YET// that's why overridnig them// displaymediastreamconstraints = {//   video: true// }if (navigator.mediaDevices.getDisplayMedia) {console.log(navigator.mediaDevices.getDisplayMedia(displaymediastreamconstraints))navigator.mediaDevices.getDisplayMedia(displaymediastreamconstraints).then(success).catch(error)} else {navigator.getDisplayMedia(displaymediastreamconstraints).then(success).catch(error)}},// 捕获屏幕captureScreen (callback) {this.invokeGetDisplayMedia(screen => {console.log(screen)this.addStreamStopListener(screen, () => {//})callback(screen)},function (error) {console.error(error)alert('Unable to capture your screen. Please check console logs.\n' + error)})},addStreamStopListener (stream, callback) {stream.addEventListener('ended',function () {callback()callback = function () {}},false)stream.addEventListener('inactive',function () {callback()callback = function () {}},false)stream.getTracks().forEach(track => {track.addEventListener('ended',() => {this.stopRecording()callback()callback = function () {}},false)track.addEventListener('inactive',function () {callback()callback = function () {}},false)})},startRecording () {this.captureScreen(screen => {this.video.srcObject = screenthis.recorder = RecordRTC(screen, {type: 'video'})this.recorder.startRecording()// release screen on stopRecordingthis.recorder.screen = screenthis.videoStart = true})},stopRecordingCallback () {this.video.src = this.video.srcObject = nullthis.video.src = URL.createObjectURL(this.recorder.getBlob())// 如果需要下载录屏文件可加上下面代码const url = URL.createObjectURL(this.recorder.getBlob())const a = document.createElement('a')document.body.appendChild(a)a.style.display = 'none'a.href = urla.download = new Date() + '.mp4'a.click()window.URL.revokeObjectURL(url)// 以上是下载所需代码this.recorder.screen.stop()this.recorder.destroy()this.recorder = nullthis.videoStart = false},stopRecording () {this.recorder.stopRecording(this.stopRecordingCallback)}}
}
</script><style scoped>
</style>

效果:

vue项目中实现录屏两种方式rrweb和RecordRTC相关推荐

  1. 在Vue项目中使用Echarts的一种方式

    主要使用了vue-echarts 1.依赖: npm i echarts -S npm i jquery -S npm i vue-echarts -S 2.使用 在main.js中: import ...

  2. Vue项目中刷新当前页面的四种方法

    Vue项目中刷新当前页面的四种方法 前记 刷新当前页面的四种方法 this.$router.go(0) location.reload() 跳转空白页再跳回原页面 使用provide / inject ...

  3. Vue项目中添加锁屏功能

    0. 直接上 预览链接 Vue项目中添加锁屏功能 1. 实现思路 ( 1 ) 设置锁屏密码 ( 2 ) 密码存localStorage (本项目已经封装h5的sessionStorage和localS ...

  4. Vue系列vue-router的参数传递的两种方式(五)

    Vue系列vue-router的参数传递的两种方式 前言 一.编写Profile页面 二.编写App.vue入口 三.路由配置,index.js 四.对比route.params方式传参 五.项目中 ...

  5. 在线直播源码,VUE 获奖名单滚动显示的两种方式

    在线直播源码,VUE 获奖名单滚动显示的两种方式 第一种: 使用vue-seamless-scroll组件: 1.安装vue-seamless-scroll npm install vue-seaml ...

  6. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  7. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  8. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 姓名:李冬辉 学号:20133201 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http ...

  9. sh执行文件 参数传递_详解shell中脚本参数传递的两种方式

    方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${ ...

最新文章

  1. 【专访英特尔高级首席工程师戴金权】普通数据工程师,如何玩转深度学习?
  2. abap选择屏幕上的button
  3. 真香 | 有了这个神器,学习 Vim 终于不难了!
  4. android控件属性
  5. 小学生学python-小学生都学Python了,你还不知道如何开始
  6. jQuery笔记---选择器
  7. 免装版_无缝贴图制作软件 PixPlant2中文免装版
  8. echart 数据点可以加链接吗_地理可视化就这么简单、酷炫,蚂蚁金服AntV 空间数据可视化引擎 L72.0发布...
  9. Java 蓝桥杯 常用核心类
  10. Win10不能直接拖文件/Foxmail不能拖文件解决办法
  11. 1283 最简单的计算机
  12. MySQL 命令无效问题
  13. 马科维兹+matlab,“马科维茨”投资组合模型实践——第三章 投资组合优化:最小方差与最大夏普比率...
  14. 关于程序员的「年龄歧视」问题,程序员的年龄天花板难道是35岁吗?
  15. 秋招/春招常见笔试题目——二叉树系列(C/C++)
  16. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》
  17. jfs jfs2_故障诊断过程因JFS2 inode带有空扩展属性条目而挂起
  18. bugku 输入密码查看flag
  19. MES上线的实施流程
  20. MASM32编程实现窗口渐入渐出效果

热门文章

  1. 【Windows】Windows软件商店无法正常安装软件
  2. 网站服务器坏了要修多久,大学服务器电脑坏了,一分钟修好收500,朋友:有钱不挣是傻子!...
  3. html的网页制作需要哪些知识,网页制作之HTML基础知识
  4. jump game ii
  5. 邢台一中2021年许计勇高考成绩查询,文理Top10!2020邢台高考成绩揭晓...
  6. 又一恐怖技能!卡耐基梅隆大学发布超强智能体,炸翻科研圈
  7. 国际学校入学考试MAP语法测试题真题讲解
  8. 苹果机和Android,苹果机和安卓机各有优缺点,但苹果机这四点让人顶不住
  9. 在WIN7、WIN10操作系统用WebDAV映射网络驱动器需要的操作
  10. hdu计算机网络实验,计算机网络实验报告(杭电).doc