打造螢幕錄影功能 chrome.desktopCapture (下)
續上回Chrome Extension 開發與實作 24-打造螢幕錄影功能 chrome.desktopCapture (上)今天來講講螢幕截錄的功能實作。
今天的範例實作大概為了四到五個小時,大至上照著上一個章節的規畫一步一步實作完成,但影片輸出的方案我作了一些微調,後面會談到。細節還不太夠,只能算是雛型。
完整的原始碼都放在:GitHub
首先是設定檔
|
|
事件腳本
|
|
點擊瀏覽器按鈕,會用新頁籤打開一個已經準備好的view。
錄制頁面的制作
|
|
畫面說明:
畫面上會有三個影象輸出區:
- live區塊:會即時顯示使用者現在正在操作的畫面。
- capture區塊:這裡會把live區塊的畫面給繪制到canvas裡。
- result區塊:當使用者停止錄影,我們會把最後錄完的片段輸出到這裡。
- 開始錄制:按下後開選擇畫面開始錄制。
- 停止錄制:停止錄制並輸出結果。
- 影片下載:點擊後下載結果影片(輸出格式是mp4)。
畫面的腳本
|
|
截錄畫面時,利用HTMLCanvasElement.captureStream()錄制畫面的相關程式碼片段。
本來在上一篇的規畫,我們應該把canvas輸出成webp再處理成webm,但我在實作上遇到了一些無法解決的問題,導致無法輸出成果,後來發現canvas直接有API提供串流,所以我就換了個作法。
|
|
結果展示
呃…不支援gifv檔,那我直接付上連結,晚點看要不要傳到youtube。
Demo 動圖
完整程式碼在GitHub,大家可以參考Chrome Extension 開發與實作 02-官網導讀:快速打造一個chrome extension下載到地端載入到擴充功能裡玩看看。
議題
- 影片下載的實作不算完成,雖然能成功下載mp4檔,但影片無法跳時播放,也無法被mac的影片播放器讀取,這部份我再找時間深入研究看看。
- 使用HTMLCanvasElement.captureStream取得的影片ffmpeg的格,這又是另一個大坑,有興趣的人請參考這篇入門文章。
- 關於取得視圖的一些雷:
- 按官方說法可以用利extension.getview來操作擴充功能打開的視圖中所有的dom物件,原本想直接在事件腳本中使用extension.getview(),來取得打開的頁籤內容進行操作。
- 但是發現在tabs.create方法的回調中無法直接取得到這個頁面,必需等上一段時間(settimeout),表示回調調用時,頁籤視窗還沒準備好。
- 後來換成window.open,無論我怎麼onread,也取不到完整的dom物件,一樣也是要等上一段時間,爬了很多文章,最後只好放棄。
- 另外就是事實有一個跟window.open很像的api叫chrome.windows,他也可以用來創造視窗,但extension.getview無法取得他開啟的視窗。
- 總之getview很詭異,都不照常理來,我卡了兩個多小時最後只好放棄。
題外話一下
關於canvas可以輸出成影片這件事,再加上可以取得影片畫畫面來繪圖,我們應該就能利用它作到影片跟動畫(2d canvas or webgl)的合成功能。我覺得蠻值得深入研究,找時間玩起XD。(題外的題外:這是之前玩webgl的一些實例)。
參考
- http://stackoverflow.com/questions/38924613/how-to-convert-array-of-png-image-data-into-video-file
- https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_Recording_API
- https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=en#stop-ended-and-active
- https://www.webrtc-experiment.com/RecordRTC/
- https://developer.mozilla.org/zh-TW/docs/Web/API/Blob
- https://developer.mozilla.org/zh-TW/docs/Web/API/URL/createObjectURL
- http://einverne.github.io/post/2015/12/ffmpeg-first.html