在线录屏

录制屏幕、窗口或某个标签页,可以暂停继续,也能把麦克风解说和共享出来的系统声混成一条音轨一起录。录完直接回放下载,画面和声音都不出这台电脑。

录制设置

码率越高画面越清晰、文件越大。4 Mbps 适合演示和教学,2 Mbps 适合长时间录会议,8 Mbps 留着录细节密集的操作。声音固定按 128 kbps 计。

点「开始录制」,然后在浏览器弹窗里选中要共享的屏幕、窗口或标签页

点「开始录制」之后浏览器会弹出共享选择窗口,在里面选中要录的屏幕、窗口或标签页。只有你亲手点了按钮并且完成了选择,录制才会开始;网页既没法替你选,也不会在后台自己录。

为什么录屏一定要用户点一下

浏览器把「读取屏幕画面」当成高危能力,规范要求拿它的接口只能由用户手势触发,并且每一次调用都必须让用户在弹窗里亲手选中共享对象——网页拿不到你选了哪个屏幕,也无权替你决定。所以页面自动调用会被拒绝,反过来任何网页都不可能在你不知情的时候偷偷录屏。想录摄像头或麦克风走的是另一套接口,会单独再问一次权限。

录制本身分三段:拿到屏幕流,把声音整理成一条音轨,再把画面和声音交给 MediaRecorder 编码。声音这一段值得多讲一句:如果同时要麦克风和系统声,正确的做法是用 AudioContext 加 MediaStreamDestination,把两路声音接到同一个目标节点上,由音频引擎混成一条立体声音轨再交给录制器。把两条音轨直接塞给同一个 MediaRecorder,在部分浏览器上会报错,在另一些上只录到第一条,行为不一致。

系统声能不能录到,取决于浏览器共享弹窗里的那个音频开关,而不是页面上的选项:页面上的开关只是提前向浏览器申请这条音轨,用户没勾选就只会拿到视频轨道。共享中的画面是一条媒体轨道,你点浏览器的「停止共享」、或者关掉被共享的窗口时,这条轨道会触发 ended 事件,所以这一页监听了它并自动收尾;切到别的标签页不会中断录制。

输出格式按能力从高到低挑:先试 WebM 的 VP9,再退到 VP8 和不指定编码的 WebM,最后是 Safari 才认的 MP4。MediaRecorder 录出的文件是流式的,文件头里没有时长字段,播放器读到的时长可能是 Infinity 或者 NaN,时间轴画不出来——修复办法是用 ffmpeg 重封装一次补齐索引,不重新编码所以不掉画质。这一页的计时用的是自己的秒表,录制中的时长是准的;录制完还想剪一剪,去视频截取片段;想截一小段做成动图,去视频转 GIF;只想留声音就去视频提取音频。

常见问题

为什么必须点按钮、还要在弹窗里选一次?

这是浏览器的硬性要求,任何网页都一样。拿屏幕画面用的是 getDisplayMedia 接口,规范要求必须由用户的手势触发(点按钮算,页面自动调用不算),并且每一次都要用户在弹窗里亲手选中共享哪个屏幕、哪个窗口或哪个标签页——网页没有权限替你决定,也拿不到你选了什么。所以「一打开页面就在后台偷偷录屏」这件事在浏览器里做不到,反过来你也只需要担心自己点了按钮的那几次。

录到一半我点了浏览器上的「停止共享」,会怎样?

会立刻自动收尾。共享中的画面是一条 MediaStreamTrack,你点停止共享时这条轨道会触发 ended 事件,页面监听它并把已经录到的内容收好、进入可下载状态,不会丢。切到别的标签页不会中断,只有主动停止共享、关闭被共享的窗口,或者整个标签页被关掉才会。

为什么录不到声音?

声音有两个来源,要分别打开。麦克风由页面上的「录入麦克风」开关控制,打开后浏览器还会单独问一次权限。系统声、网页声这类声音,必须在浏览器弹出的共享窗口里勾上「分享标签页音频」或「分享系统音频」——这个开关在浏览器的弹窗里,不在页面上,网页无权替你打开,所以页面上那个「共享音频」开关只是提前向浏览器申请这条音轨。两个都关了当然就是无声视频。

为什么要把麦克风和系统声混成一条音轨?

因为把两条音轨直接塞进同一个 MediaRecorder 在部分浏览器上会出问题:有的直接报错,有的只录到第一条,还有的会让整段录制失败。改用 AudioContext 加 MediaStreamDestination,把两路声音都接到同一个目标节点上,由音频引擎混成一条立体声音轨再交给录制器,各家浏览器的行为就一致了,也能顺便做回声消除和降噪。

录出来的文件为什么没有时长,拖不动进度条?

MediaRecorder 录出的 WebM 是流式的,文件头里没有写时长字段,浏览器读完元信息后 duration 是 Infinity 或者 NaN,播放器就画不出时间轴。这不是文件坏了:可以用 ffmpeg 重封装一次修复(把输入和输出换成同一个文件即可,视频不重新编码),也可以直接用视频截取或视频转 GIF 这些工具处理,它们内部会先逼浏览器把索引解析完拿到真实时长再算。

时长和体积大概是多少?

体积基本等于码率乘时长。默认的 4 Mbps 下,一分钟大约 30 兆字节,一小时接近 1.8 GB;选 8 Mbps 就要翻倍。所以页面上会随时显示预估体积,超过 500 兆会提醒。想录很久的会议,把码率降到 2 Mbps,画面里的文字会稍微糊一点,但体积能砍一半以上。

为什么录出来的画面会卡、或者帧率比游戏低?

录制是实时编码,编码器要和被录的程序抢 CPU。游戏、视频剪辑这类本来就吃满显卡的程序被录时掉帧最明显,因为画面变化越多,每一帧要压的数据越多。降低码率、把窗口调小、关掉其他标签页都能缓解。另外浏览器本身也会限制共享画面的帧率上限,写多高都没用。

这一段录屏能再压一压或者剪一剪吗?

可以。录完先用视频截取剪掉多余的头尾,再用视频转 GIF 截一小段做成动图;只要单张画面就用视频截图取帧导出 PNG;只想留声音就用视频提取音频把音轨分离成 WAV。想缩小体积的话,录屏这类画面变化不大的内容在 2 Mbps 下通常就看不出差别,重录一次比后期二次编码更干净。

相关:视频截取片段视频转 GIF视频截图取帧