实现一小时高清网页录屏的关键是分段录制+后端拼接或流式转封装,需每25–30秒切片释放内存、调优编码参数(如1080p设4mbps)、边录边传至后端用ffmpeg合并,并通过localstorage和indexeddb保障中断恢复与上传可靠性。

实现一小时高清网页录屏的关键不在 MediaRecorder 本身,而在于合理规避其内存与编码瓶颈——它默认不支持长时间连续录制,直接调用 start() 后持续 ondataavailable 会快速耗尽内存或触发浏览器强制中断。真正可行的方案是“分段录制 + 后端拼接”或“前端流式转封装”,下面给出稳定落地的实操路径。
分段录制:每30秒自动切片并释放内存
MediaRecorder 本身支持 stop() 和重新 start(),但需确保每次停止后清空引用、释放 Blob,并避免重复添加事件监听器。推荐按固定时长(如25–30秒)切片,兼顾稳定性与后期处理便利性:
- 创建 Recorder 实例后,用
setTimeout或requestAnimationFrame计时,到时立即调用recorder.stop() - 在
ondataavailable中生成 Blob 并立即转为ArrayBuffer或上传至后端,随后手动置空recorder引用(recorder = null) - 新建
MediaRecorder实例前,确保媒体流(getDisplayMedia获取的 stream)仍处于活动状态;若页面失焦或系统休眠,需监听visibilitychange做暂停/恢复逻辑
编码参数调优:平衡画质、体积与浏览器兼容性
高清≠高码率硬扛。Chrome 114+ 支持 videoBitsPerSecond 和 audioBitsPerSecond 精确控制,但 Safari(WebRTC 录制受限)和旧版 Edge 仅支持 mime 类型协商。建议配置如下:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 视频使用
video/webm; codecs="vp9"(Chrome/Firefox)或video/mp4; codecs="avc1.640032"(Safari 17+),避免h264在非 Safari 下不可用 - 1080p 录制设
videoBitsPerSecond: 4_000_000(4Mbps),720p 设2_500_000;音频统一用audioBitsPerSecond: 128_000(AAC-LC) - 禁用
ignoreMutedMedia(默认 true),防止静音时音频轨道被丢弃导致音画不同步
流式上传 + 后端合并:绕过前端存储瓶颈
一小时原始 WebM 可达 3–5GB,前端无法持久保存。更可靠的做法是边录边传,由后端实时接收分片并写入临时文件,最后用 FFmpeg 合并:
- 每个分片 Blob 通过
fetch流式上传(body: blob),后端用multipart/form-data或直接 raw body 接收 - 服务端记录分片序号、时间戳、编码参数,确保合并时顺序正确、关键帧对齐(VP9/AV1 需注意 keyframe interval 一致性)
- 合并命令示例:
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4,其中list.txt按序列出所有分片路径
兜底与用户体验:中断恢复与状态同步
用户网络波动、页面崩溃或系统休眠都可能导致录制中断。必须提供可恢复能力:
- 将当前录制序号、起始时间戳、媒体流 ID 存入
localStorage,页面重载后检查是否续录(需重新获取屏幕流并校验 track.id 匹配) - 用
navigator.onLine+fetch().catch监控上传失败,失败分片缓存至 IndexedDB,待恢复后重传 - UI 上显示实时已录时长、分片数量、上传进度条,避免用户误操作关闭页面
不复杂但容易忽略:MediaRecorder 的 state 变化(inactive → recording → inactive)需严格监听 onstart/onstop,而非仅依赖定时器;同时,getDisplayMedia 返回的 stream 必须在每次新建 Recorder 前验证 active === true,否则 Chrome 会静默失败。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










