如何用 WebCodecs 在浏览器里实现高清录屏 —— 无插件、无水印、直接导出 MP4
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
导读 录屏是浏览器的"老大难"需求:想在网页里录一段高清带声音的屏幕,听起来简单,但用过 这篇文章分享一套我在生产环境里落地的方案: 先说结论:为什么不用 MediaRecorder
而 WebCodecs(Chrome 94+、Edge、Safari 16.4+)把 整条管线长这样: 下面按数据流向一步步拆。 第一步:采集屏幕和音频视频采集用 音频来源分四种:不录 / 系统声音 / 麦克风 / 两者都要。有两个坑: 坑 1:系统声音是"随视频来的"。 坑 2:系统声音 + 麦克风是两条独立的轨,而 MP4 里通常只有一条音轨。解法是 WebAudio 混音: 第二步:码率公式——文字清晰的第一要义屏幕录制的内容(UI、代码、文档)以锐利边缘和高频细节为主,和摄像头画面完全不同。压住码率必然糊文字,所以码率必须按像素量算,而不是拍一个固定值。 我用的经验公式是 0.12 bit/像素: 落成代码(夹在 8~32 Mbps 之间,三档画质在此基础上 ×0.6 / ×1 / ×1.5):
对照一下感受下量级:1080p30 高清档 ≈ 9 Mbps,4K30 ≈ 30 Mbps。这个码率录出来的文字放大看边缘是锐的,而不是一团色块。 配合两个参数一起服用:
第三步:编码器协商——别假设任何编解码器存在WebCodecs 的编解码器支持因平台而异:同样一份 所以一切配置都必须先问 音频同样如此:AAC 优先,没有 AAC 就转 Opus。这里有个冷知识——Opus 编码器只接受 48kHz 采样率,而麦克风轨常常是 44.1kHz。解法是再借一次 WebAudio,用一个 48kHz 的 第四步:核心帧循环——时间戳、暂停、背压这是整个方案的心脏。视频轨用 首帧探测不要在拿到轨道后立刻建编码器—— 时间戳必须用 BigIntWebCodecs 的 我一开始写的是 这行在 JS 里直接抛 教训两条:① 和时间戳做运算的常量也必须是 bigint(
|
| 决策 | 原因 |
|---|---|
| WebCodecs 而非 MediaRecorder | MP4 直出、码率/profile/GOP 全可控 |
| 码率 = 像素量 × 0.12bpp | 屏幕内容以文字锐度为先 |
| 一切编解码器先探测再使用 | 平台差异(AAC 缺失、4K Level)比想象中常见 |
| 时间戳全 BigInt + 暂停补偿 | 微秒精度 + 导出无暂停空档 |
| encodeQueueSize 背压丢帧 | 长录制内存安全 |
| 收尾全程防御式 flush/close | 不让收尾异常掩盖真实错误 |
在线体验:我把这套方案做成了免费工具(无需注册、无水印、不限时长): 👉 tools.gochina.help/screen-reco…
如果你只想录个屏,直接用就好;如果你在实现类似功能,希望这篇少帮你踩几个坑。有问题欢迎评论区交流。
阅读原文:点击这里