Skip to main content
在扩展页面中用 getDisplayMedia 录制屏幕,用 MediaRecorder 编码,再用 downloads API 保存结果。

选择一个捕获 API

getDisplayMedia 不需要 manifest 权限。浏览器会显示一个来源选择器,这个提示本身就是用户同意。tabCapture 跳过选择器,但需要 tabCapture 权限,以及此前在扩展上的一次用户手势,比如点击 action。

Manifest

只有当你从 offscreen 文档录制时才把 offscreen 加入 permissions。
manifest.json

打开一个录制页面

popup 在失去焦点时会关闭,这会中断它的录制。请改为把录制器放在一个专用页面上。把 recorder.htmlrecorder.js 放进 pages/ 特殊文件夹,Extension.js 会把它们作为入口编译。
background.js

用 getDisplayMedia 录制

getDisplayMedia 需要用户手势,所以要在点击处理器里调用它,永远不要在页面加载时调用。
pages/recorder.js
blob URL 在这里可用,因为录制器是一个文档,而不是 service worker。

改为捕获活动标签页

使用 tabCapture 时,后台把一个 stream id 交给你的页面,页面再把它变成一个流。不会出现选择器。
pages/recorder.js
把得到的流送入上文同样的 MediaRecorder 流程。

在后台录制

要在没有任何可见扩展页面的情况下持续录制,Chrome 提供了 offscreen 文档。用 chrome.offscreen.createDocumentUSER_MEDIA 原因创建一个,然后在那里运行捕获代码。这需要 offscreen 权限,且只在 Chromium 上可用。

运行

点击 action 图标打开录制页面。开始一次捕获,停止它,WebM 文件就会出现在你的下载目录里。

Firefox 说明

  • getDisplayMediaMediaRecorder 在 Firefox 的扩展页面中可用,所以主教程是可移植的。
  • Firefox 不支持 tabCapture 和 offscreen 文档。
  • 使用浏览器特定的 manifest 字段,让 tabCapture 权限不进入 Firefox 构建。

从模板开始

special-folders-pages 模板展示了承载录制页面的 pages/ 布局。
代码仓库:extension-js/examples/special-folders-pages

最佳实践

  • 录制结束时停止每一条轨道,让浏览器移除共享指示器。
  • 按浏览器选择捕获 API:getDisplayMedia 各处通用,tabCapture 用于 Chromium 的仅标签页流程。
  • 保持 saveAs: true,让用户选择录制文件的去处。
  • recorder.start(timeslice) 对长录制分块,控制内存占用。

下一步