html无原生screenrecord api,需用javascript调用getdisplaymedia()获取屏幕流,再通过mediarecorder录制为blob文件;必须用户手势触发、运行于https或localhost安全上下文,且不支持file://协议。

HTML 里没有原生 screenRecord API,别被误导
浏览器不提供直接调用系统录屏的 HTML 标签或属性。所谓“HTML 实现录屏”,本质是通过 JavaScript 调用 MediaDevices.getDisplayMedia() 获取屏幕流,再用 MediaRecorder 录制,最后导出为 Blob 视频文件——整个过程必须由用户主动触发(比如点击按钮),且受浏览器权限、安全上下文(https 或 localhost)严格限制。
常见错误现象:getScreenMedia is not defined(旧 API 已废弃)、NotAllowedError(没点允许按钮或非安全上下文)、录出来黑屏(没处理 video: true 选项或未正确绑定 srcObject)。
- 必须在用户手势(如
click)中调用getDisplayMedia(),不能 onload 自动执行 - Chrome/Edge 要求页面运行在
https或localhost;HTTP 域名下直接拒绝 - Firefox 默认只允许录制窗口,不支持“整个屏幕”,需用户手动选;Chrome 支持但需显式传
{ video: true } - 移动端浏览器(包括 iOS Safari)基本不支持
getDisplayMedia(),别浪费时间适配
MediaRecorder 录制时为什么没声音或只有黑屏
默认 getDisplayMedia({ video: true }) 只捕获画面,不包含系统音频(这是浏览器刻意设计的安全隔离)。想录声音,得额外用 getUserMedia({ audio: true }) 混音,但实际几乎不可行:不同来源的 MediaStream 无法直接合并为一个可录制流(MediaStream.addTrack() 在跨源流上会静音或报错)。
黑屏主因是没把获取到的流赋给 video 元素:video.srcObject = stream 缺失,或用了已废弃的 createObjectURL()。
- 录制前务必检查流是否有效:
stream.getVideoTracks().length > 0 - 播放预览时,设
video.muted = true(否则 Chrome 可能因自动播放策略阻塞) - 不要用
video.src = URL.createObjectURL(stream)—— 这是过时写法,应始终用srcObject - 若需音频,唯一可靠方案是让用户开启麦克风并口述,或后端用 FFmpeg 合成(前端做不到系统级音频捕获)
保存视频文件时 Blob 下载失败或格式异常
录制结束得到的 Blob 默认 MIME 类型是 video/webm(Chrome/Edge)或 video/mp4(仅 Safari,且不稳定)。直接用 a.download 下载没问题,但若想转成 MP4 并保证兼容性,不能靠前端 JS “转码”——Blob 不是视频容器,只是二进制快照,改后缀不会改变编码格式。
常见错误:new Blob([blob], { type: 'video/mp4' }) —— 这只是骗浏览器的 MIME,实际内容还是 WebM,Windows 系统可能打不开。
- 下载链接必须用
URL.createObjectURL(blob)创建,且下载后立即URL.revokeObjectURL()防内存泄漏 - 如果需要 MP4,必须走服务端:把 Blob 上传,用 FFmpeg 解码再重编码(前端无解)
- 移动端 Safari 对
MediaRecorder支持极差,常返回空ondataavailable,建议检测MediaRecorder.isTypeSupported('video/webm')后降级提示 - 大视频(>500MB)容易触发内存溢出,建议分段录制(
mediaRecorder.start(10000)设定 timeslice)
为什么本地开发用 file:// 打开一定失败
getDisplayMedia() 和 MediaRecorder 都要求安全上下文(secure context),而 file:// 协议不属于安全上下文,所有主流浏览器都会静默拒绝,控制台可能只报 NotAllowedError,不解释原因。
这不是代码 bug,是浏览器强制策略。哪怕你把所有 JS 写对了,双击 HTML 文件打开也必然失败。
- 必须用本地服务器:
npx serve、python3 -m http.server、VS Code Live Server 插件等 - 确保地址栏显示
http://localhost:xxxx或https://开头,而不是file:/// - 某些公司内网环境即使 HTTP 也会被判定为不安全,此时只能部署到 HTTPS 服务上测试
真正卡住人的从来不是 API 调用几行代码,而是权限弹窗时机、安全上下文判断、跨浏览器行为差异和 Blob 导出后的格式信任问题——这些细节不亲手试三次以上,光看文档根本绕不过去。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











