Skip to main content
在擴充功能頁面用 getDisplayMedia 錄製螢幕,用 MediaRecorder 編碼,再用 downloads API 儲存結果。

選擇擷取 API

getDisplayMedia 不需要 manifest 權限。瀏覽器會顯示來源選擇器,那個提示就是同意本身。tabCapture 略過選擇器,但需要 tabCapture 權限,以及先前在擴充功能上的使用者手勢,例如點擊 action。

Manifest

只有從 offscreen document 錄製時,才把 offscreen 加入 permissions。
manifest.json

開啟錄製頁面

popup 失去焦點就會關閉,錄製也隨之中止。改把錄製器放在專屬頁面上。把 recorder.htmlrecorder.js 放進 pages/ 特殊資料夾,Extension.js 會把它們編譯為 entrypoint。
background.js

用 getDisplayMedia 錄製

getDisplayMedia 需要使用者手勢,因此要在點擊處理器中呼叫,絕不在頁面載入時呼叫。
pages/recorder.js
blob URL 在這裡可以運作,因為錄製器是一個 document,而不是 service worker。

改為擷取使用中的分頁

使用 tabCapture 時,background 把串流 id 交給你的頁面,頁面再把它變成串流。不會出現選擇器。
pages/recorder.js
把得到的串流餵給與上面相同的 MediaRecorder 流程。

在背景錄製

要在沒有任何可見擴充功能頁面的情況下持續錄製,Chrome 提供 offscreen document。用 chrome.offscreen.createDocument 搭配 USER_MEDIA 理由建立一個,然後在那裡執行擷取程式碼。這需要 offscreen 權限,而且僅限 Chromium。

執行

點擊 action 圖示開啟錄製頁面。開始擷取,停止之後,WebM 檔案就會出現在你的下載中。

Firefox 注意事項

  • getDisplayMediaMediaRecorder 在 Firefox 擴充功能頁面可以運作,因此主流程是可移植的。
  • Firefox 不支援 tabCapture 與 offscreen document。
  • 使用 瀏覽器專屬 manifest 欄位,讓 tabCapture 權限不進入 Firefox 建置。

從範本開始

special-folders-pages 範本展示了承載錄製頁面的 pages/ 版面。
儲存庫:extension-js/examples/special-folders-pages

最佳實務

  • 錄製結束時停止每個 track,讓瀏覽器移除分享指示器。
  • 依瀏覽器選擇擷取 API:getDisplayMedia 到處可用,tabCapture 用於 Chromium 的僅限分頁流程。
  • 保持 saveAs: true,讓使用者選擇錄影的存放位置。
  • recorder.start(timeslice) 把長時間錄製切塊,以限制記憶體用量。

後續步驟