getDisplayMedia 錄製螢幕,用 MediaRecorder 編碼,再用 downloads API 儲存結果。
選擇擷取 API
getDisplayMedia 不需要 manifest 權限。瀏覽器會顯示來源選擇器,那個提示就是同意本身。tabCapture 略過選擇器,但需要 tabCapture 權限,以及先前在擴充功能上的使用者手勢,例如點擊 action。
Manifest
只有從 offscreen document 錄製時,才把offscreen 加入 permissions。
manifest.json
開啟錄製頁面
popup 失去焦點就會關閉,錄製也隨之中止。改把錄製器放在專屬頁面上。把recorder.html 與 recorder.js 放進 pages/ 特殊資料夾,Extension.js 會把它們編譯為 entrypoint。
background.js
用 getDisplayMedia 錄製
getDisplayMedia 需要使用者手勢,因此要在點擊處理器中呼叫,絕不在頁面載入時呼叫。
pages/recorder.js
改為擷取使用中的分頁
使用tabCapture 時,background 把串流 id 交給你的頁面,頁面再把它變成串流。不會出現選擇器。
pages/recorder.js
MediaRecorder 流程。
在背景錄製
要在沒有任何可見擴充功能頁面的情況下持續錄製,Chrome 提供 offscreen document。用chrome.offscreen.createDocument 搭配 USER_MEDIA 理由建立一個,然後在那裡執行擷取程式碼。這需要 offscreen 權限,而且僅限 Chromium。
執行
Firefox 注意事項
getDisplayMedia與MediaRecorder在 Firefox 擴充功能頁面可以運作,因此主流程是可移植的。- Firefox 不支援
tabCapture與 offscreen document。 - 使用 瀏覽器專屬 manifest 欄位,讓
tabCapture權限不進入 Firefox 建置。
從範本開始
special-folders-pages 範本展示了承載錄製頁面的 pages/ 版面。
最佳實務
- 錄製結束時停止每個 track,讓瀏覽器移除分享指示器。
- 依瀏覽器選擇擷取 API:
getDisplayMedia到處可用,tabCapture用於 Chromium 的僅限分頁流程。 - 保持
saveAs: true,讓使用者選擇錄影的存放位置。 - 用
recorder.start(timeslice)把長時間錄製切塊,以限制記憶體用量。

