使用JavaScript實(shí)現(xiàn)一個(gè)錄屏插件
準(zhǔn)備工作
開始寫代碼前我們需要先了解一下以下幾點(diǎn):
1、getDisplayMedia
navigator.mediaDevices.getDisplayMedia()
是一種基于Web的API,它允許網(wǎng)站在獲得用戶同意的情況下,捕獲用戶的屏幕或屏幕的特定部分作為媒體流。這個(gè)API是Media Capture and Streams API的一部分,通常用于實(shí)現(xiàn)屏幕共享功能,例如遠(yuǎn)程協(xié)作、視頻會(huì)議或直播。
基本用法
getDisplayMedia()
方法返回一個(gè)Promise,該P(yáng)romise解析為一個(gè)MediaStream
對(duì)象,其中包含屏幕捕獲的數(shù)據(jù)。使用此方法的基本步驟如下:
- 調(diào)用
getDisplayMedia()
并傳入配置對(duì)象,指定所需的媒體類型和可選的約束條件。 - 處理Promise解析后的
MediaStream
對(duì)象,例如將其用作MediaRecorder
的源或顯示在<video>
元素中。
if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) { const displayMediaOptions = { video: { cursor: "always" // 捕獲鼠標(biāo)指針 }, audio: false // 不捕獲音頻 }; navigator.mediaDevices.getDisplayMedia(displayMediaOptions) .then(stream => { // 屏幕捕獲成功,'stream' 包含屏幕的媒體流 }) .catch(error => { // 捕獲屏幕失敗 console.error("Error: ", error); }); }
重要特性
- 用戶授權(quán):出于安全和隱私的考慮,瀏覽器要求用戶明確授權(quán)才能進(jìn)行屏幕捕獲。
- 異步操作:
getDisplayMedia()
是異步的,返回一個(gè)Promise對(duì)象。 - 媒體類型:可以捕獲視頻和/或音頻,具體取決于
getDisplayMedia()
調(diào)用中的配置選項(xiàng)。 - 瀏覽器兼容性:不同的瀏覽器可能有不同的實(shí)現(xiàn)和支持程度,需要檢查
navigator.mediaDevices.getDisplayMedia
是否存在。
安全和隱私
- 屏幕捕獲是一個(gè)敏感操作,因?yàn)樗赡苌婕暗讲东@用戶的敏感信息。因此,瀏覽器會(huì)要求用戶明確授權(quán)。
- 網(wǎng)站在使用
getDisplayMedia()
時(shí)應(yīng)該明確告知用戶,并在獲得用戶同意后進(jìn)行。
應(yīng)用場(chǎng)景
- 視頻會(huì)議:用戶可以共享他們的屏幕或應(yīng)用程序窗口,以便在遠(yuǎn)程會(huì)議中展示內(nèi)容。
- 直播:游戲直播者可以共享他們的游戲畫面。
- 遠(yuǎn)程支持:技術(shù)支持人員可以請(qǐng)求訪問(wèn)用戶的屏幕來(lái)幫助解決問(wèn)題。
getDisplayMedia()
提供了一種強(qiáng)大的方式,允許Web應(yīng)用以用戶控制的方式捕獲和使用屏幕內(nèi)容。
2、快速開發(fā)一個(gè)插件
可以通過(guò)腳手架快速生成一個(gè)插件基本框架。
安裝jyeontu腳手架
npm install jyeontu
使用腳手架快速創(chuàng)建新項(xiàng)目
jyeontu create
選擇 Chrome 插件模板
即可
初始化
npm run init
打包
npm run build
插件開發(fā)
目標(biāo)
1、在瀏覽器中頁(yè)面右鍵菜單加上開始錄屏按鈕
2、點(diǎn)擊開始錄屏按鈕后彈出新頁(yè)面選擇錄取的屏幕
3、結(jié)束錄屏后輸出視頻文件
功能實(shí)現(xiàn)
1、瀏覽器右鍵菜單添加按鈕
const id = "screenRecording"; //generateRandomString(8); chrome.contextMenus.create({ title: "開始錄屏", //菜單的名稱 id: id, //一級(jí)菜單的id contexts: ["page"], // page表示頁(yè)面右鍵就會(huì)有這個(gè)菜單,如果想要當(dāng)選中文字時(shí)才會(huì)出現(xiàn)此右鍵菜單,用:selection });
2、監(jiān)聽右鍵菜單點(diǎn)擊事件
這里直接借用百度首頁(yè)做個(gè)中間頁(yè)面來(lái)觸發(fā)錄屏事件
chrome.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId == id) { var createData = { url: "https://baidu.com?isStartMediaRecorder=1", // url: chrome.runtime.getURL("recorder.html"), type: "normal", top: 200, left: 300, width: 1300, height: 800, }; // 創(chuàng)建(打開)一個(gè)新的瀏覽器窗口,可以提供大小、位置或默認(rèn) URL 等可選參數(shù) chrome.windows.create(createData); } });
3、判斷是否錄屏彈窗
直接判斷路徑參數(shù)isStartMediaRecorder即可
localStorage.setItem("isMediaRecorderEnd", false); const url = new URL(location.href); const isStartMediaRecorder = url.searchParams.get("isStartMediaRecorder"); if (isStartMediaRecorder) { document.body.style.display = "flex"; document.body.innerHTML = `<div style=" font-size: large; margin: auto; font-weight: bold; text-align: center; " > 錄制中 </div>`; startMediaRecorder(); }
4、開始錄屏
function startRecorder(stream) { var mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") ? "video/webm; codecs=vp9" : "video/webm"; var mediaRecorder = new MediaRecorder(stream, { mimeType: mime }); // 錄制 var chunks = []; mediaRecorder.addEventListener("dataavailable", function (e) { chunks.push(e.data); }); // 監(jiān)聽用戶取消屏幕共享 stream.getTracks().forEach((track) => { track.addEventListener("ended", function (e) { console.log("軌道結(jié)束: ", e); // 用戶取消屏幕共享,執(zhí)行清理操作 mediaRecorder.stop(); // 停止錄制 }); }); mediaRecorder.start(); // 手動(dòng)啟動(dòng)錄制 } function startMediaRecorder() { navigator.mediaDevices .getDisplayMedia({ video: true, }) .then((stream) => { startRecorder(stream); }) .catch((err) => { console.warn(err); localStorage.setItem("isMediaRecorderEnd", true); }); }
5、錄屏結(jié)束
監(jiān)聽錄屏結(jié)束事件,并使用a標(biāo)簽將錄制視頻下載到本地。
function getFormattedCurrentTime() { const now = new Date(); // 獲取當(dāng)前時(shí)間 const year = now.getFullYear(); // 年份 const month = (now.getMonth() + 1).toString().padStart(2, "0"); // 月份,加1因?yàn)樵路菔菑?開始的 const day = now.getDate().toString().padStart(2, "0"); // 日期 const hours = now.getHours().toString().padStart(2, "0"); // 小時(shí) const minutes = now.getMinutes().toString().padStart(2, "0"); // 分鐘 const seconds = now.getSeconds().toString().padStart(2, "0"); // 秒 return `${year}${month}${day}${hours}${minutes}${seconds}`; } mediaRecorder.addEventListener("stop", function () { var blob = new Blob(chunks, { type: "video/webm" }); // 確保Blob的MIME類型正確 var url = URL.createObjectURL(blob); var a = document.createElement("a"); a.href = url; a.download = getFormattedCurrentTime() + "-video.webm"; a.click(); setTimeout(() => { localStorage.setItem("isMediaRecorderEnd", true); }, 200); });
插件使用
下載
下載地址:gitee.com/zheng_yongtao/chrome-plug-in/blob/master/screenRecording/screenRecording.zip
安裝
下載解壓后導(dǎo)入chrome:chrome://extensions/
選擇解壓后的文件夾即可
到此這篇關(guān)于使用JavaScript實(shí)現(xiàn)一個(gè)錄屏插件的文章就介紹到這了,更多相關(guān)JavaScript錄屏內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從零使用TypeScript開發(fā)項(xiàng)目打包發(fā)布到npm
這篇文章主要介紹了從零使用TypeScript開發(fā)項(xiàng)目打包發(fā)布到npm,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02js+html實(shí)現(xiàn)網(wǎng)頁(yè)五子棋
這篇文章主要為大家詳細(xì)介紹了js+html實(shí)現(xiàn)網(wǎng)頁(yè)五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05excel操作之Add Data to a Spreadsheet Cell
excel操作之Add Data to a Spreadsheet Cell...2007-06-06layui 數(shù)據(jù)表格 根據(jù)值(1=業(yè)務(wù),2=機(jī)構(gòu))顯示中文名稱示例
今天小編就為大家分享一篇layui 數(shù)據(jù)表格 根據(jù)值(1=業(yè)務(wù),2=機(jī)構(gòu))顯示中文名稱示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10微信小程序頁(yè)面間傳值的實(shí)現(xiàn)方法示例
這篇文章主要給大家介紹了關(guān)于微信小程序頁(yè)面間傳值的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04onmouseover事件和onmouseout事件全面理解
最近兩天在溫習(xí)onmouseover事件和onmouseout事件,其實(shí)里面有很多深?yuàn)W的知識(shí),接下來(lái)小編給大家?guī)?lái)了onmouseover事件和onmouseout事件全面了解,感興趣的朋友一起看下2016-08-08javascript實(shí)現(xiàn)循環(huán)廣告條效果
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)循環(huán)廣告條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12JavaScript樹結(jié)構(gòu)深度優(yōu)先算法
這篇文章主要介紹了JavaScript樹結(jié)構(gòu)深度優(yōu)先算法,樹結(jié)構(gòu)可以說(shuō)是前端中最常見的數(shù)據(jù)結(jié)構(gòu)之一,比如說(shuō)DOM樹、級(jí)聯(lián)選擇、樹形組件,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-07-07