前端网页录屏是怎么实现的

前端网页录屏主要通过浏览器提供的原生API实现,核心方案是利用 ‌WebRTC‌ 获取屏幕流,再通过 ‌MediaRecorder API‌ 将流录制为视频文件。此外,还有一种"无感 "方案,通过记录DOM变化来回放用户操作,而非直接录制视频

以下是两种主流实现方式的详细说明:

1. 有感录屏:录制屏幕视频流(最常用)

这是目前最主流、兼容性最好的方案,用户能明确感知并授权录屏过程。它分为三个核心步骤:

**‌获取屏幕流‌:使用 navigator.mediaDevices.getDisplayMedia() 方法,向用户请求权限,以捕获整个屏幕、特定窗口或浏览器标签页的视频流(可选包含系统音频)。
录制媒体流‌:**使用 MediaRecorder 对象,将获取到的视频流(MediaStream)录制为二进制数据块(Chunks)。
‌生成并下载视频‌ :录制结束后,将所有数据块合并成一个 Blob 对象,生成一个临时URL,并创建一个下载链接供用户保存为视频文件(通常为WebM格式)。

‌核心代码示例:

javascript 复制代码
// 开始录制
async function startRecording() {
  try {
    // 1. 请求屏幕流
    const stream = await navigator.mediaDevices.getDisplayMedia({
      video: { cursor: "always" }, // 显示鼠标指针
      audio: true // 录制系统声音
    });

    // 2. 初始化MediaRecorder
    const mimeType = MediaRecorder.isTypeSupported('video/webm;codecs=vp9') ? 'video/webm;codecs=vp9' : 'video/webm';
    const mediaRecorder = new MediaRecorder(stream, { mimeType });
    const chunks = [];

    // 3. 收集录制数据
    mediaRecorder.ondataavailable = (event) => {
      if (event.data.size > 0) chunks.push(event.data);
    };

    // 4. 停止录制并生成文件
    mediaRecorder.onstop = () => {
      const blob = new Blob(chunks, { type: mimeType });
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = `recording-${Date.now()}.webm`;
      a.click();
      URL.revokeObjectURL(url); // 释放内存
    };

    mediaRecorder.start();
    return { stream, mediaRecorder }; // 保留引用以便停止
  } catch (err) {
    console.error('录屏失败:', err);
  }
}

// 停止录制
function stopRecording(mediaRecorder) {
  mediaRecorder.stop();
}

关键注意事项:‌

‌用户授权‌ :getDisplayMedia() 必须由用户的主动操作 (如点击按钮)触发,浏览器才会弹出授权窗口。
‌安全环境‌ :该API仅在 HTTPS 或 localhost 环境下可用。

浏览器兼容性‌ :Chrome、Firefox、Edge 等现代浏览器均支持,但 Safari 对部分编码格式(如VP9)支持有限,需提供降级方案(如回退到 video/webm)。
‌资源释放‌ :录制结束后,务必调用 stream.getTracks().forEach(track => track.stop()) 关闭媒体流,防止内存泄漏。

2. 无感录屏:记录DOM操作(用于行为分析)

这种方案不直接录制视频,而是通过监听和记录页面DOM结构的变化(如元素增删、属性修改、鼠标移动、输入等),将这些操作序列化为JSON数据。回放时,再将这些JSON数据重新构建出用户操作的完整过程

‌核心优势:‌

‌轻量化‌ :JSON数据量远小于视频文件,网络传输和存储成本极低。
‌无感知‌ :用户完全不会察觉到被录制,适用于用户行为分析、线上Bug复现等场景。
‌主流工具 :rrweb‌

rrweb 是一个开源的、功能强大的库,专门为此类需求设计。它由三部分组成:

‌rrweb-snapshot‌:将页面DOM快照序列化为JSON。

‌rrweb‌:记录DOM的增量变化事件。

‌rrweb-player‌:用于回放录制的事件流。

‌核心代码示例:

javascript 复制代码
import { record } from 'rrweb';

// 录制
const events = [];
const stopRecording = record({
  emit(event) {
    events.push(event); // 将每个操作事件存入数组
  },
  recordCanvas: true, // 记录canvas内容
  collectFonts: true // 收集字体
});

// 回放
import rrwebPlayer from 'rrweb-player';
import 'rrweb-player/dist/style.css';

new rrwebPlayer({
  target: document.getElementById('player'), // 回放容器
  props: {
    events: events // 传入录制的事件数组
  }
});

‌适用场景:‌

监控用户在网站上的操作路径,用于产品优化。

在线上应用出现Bug时,录制用户操作流程,帮助开发者精准复现问题。

在线考试监考(记录用户行为而非屏幕画面)。
‌总结:‌

如果你需要‌录制视频文件‌用于分享、存档,应选择 ‌MediaRecorder + getDisplayMedia‌ 方案。

如果你需要‌分析用户行为‌、‌复现线上Bug‌,且希望‌轻量、无感知‌,则应选择 ‌rrweb‌ 等DOM录制方案

相关推荐
lzksword几秒前
C++ Builder XE OpenDialog1打开多文件并显示xls与xlsx二种格式文件
java·前端·c++
陈随易9 分钟前
站在普通开发者的角度,我觉得 RollCode 更像是“把 H5 交付这件事重新捋顺了”
前端·后端·程序员
陈随易27 分钟前
RollCode:不只是在做页面,而是在缩短“从需求到上线”的整条链路
前端·后端
炽烈小老头1 小时前
【每天学习一点算法 2026/03/17】括号生成
前端·学习·typescript
大漠_w3cpluscom1 小时前
如何在 CSS 中正确使用 if()
前端
eason_fan1 小时前
踩坑记录:Mac M系列芯片下 pnpm dlx 触发的 esbuild 架构不匹配错误
前端·前端工程化
swipe1 小时前
JavaScript 对象操作进阶:从属性描述符到对象创建模式
前端·javascript·面试
IT_陈寒1 小时前
React开发者都在偷偷用的5个性能优化黑科技,你知道几个?
前端·人工智能·后端
还是大剑师兰特2 小时前
Vue3 前端专属配置(VSCode settings.json + .prettierrc)
前端·vscode·json
前端小趴菜052 小时前
vue3项目优化方案
前端·javascript·vue.js