最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用JavaScript實現(xiàn)一個錄屏插件

 更新時間:2024年10月23日 09:57:09   作者:JYeontu  
不知道大家平時都是使用什么錄屏軟件呢,有沒有想過只用JavaScript我們也可以快速實現(xiàn)一個錄屏插件呢,感興趣的小伙伴就跟隨小編一起學(xué)習(xí)一下吧

準(zhǔn)備工作

開始寫代碼前我們需要先了解一下以下幾點:

1、getDisplayMedia

navigator.mediaDevices.getDisplayMedia() 是一種基于Web的API,它允許網(wǎng)站在獲得用戶同意的情況下,捕獲用戶的屏幕或屏幕的特定部分作為媒體流。這個API是Media Capture and Streams API的一部分,通常用于實現(xiàn)屏幕共享功能,例如遠(yuǎn)程協(xié)作、視頻會議或直播。

基本用法

getDisplayMedia() 方法返回一個Promise,該Promise解析為一個MediaStream對象,其中包含屏幕捕獲的數(shù)據(jù)。使用此方法的基本步驟如下:

  • 調(diào)用 getDisplayMedia() 并傳入配置對象,指定所需的媒體類型和可選的約束條件。
  • 處理Promise解析后的MediaStream對象,例如將其用作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() 是異步的,返回一個Promise對象。
  • 媒體類型:可以捕獲視頻和/或音頻,具體取決于getDisplayMedia()調(diào)用中的配置選項。
  • 瀏覽器兼容性:不同的瀏覽器可能有不同的實現(xiàn)和支持程度,需要檢查navigator.mediaDevices.getDisplayMedia是否存在。

安全和隱私

  • 屏幕捕獲是一個敏感操作,因為它可能涉及到捕獲用戶的敏感信息。因此,瀏覽器會要求用戶明確授權(quán)。
  • 網(wǎng)站在使用getDisplayMedia()時應(yīng)該明確告知用戶,并在獲得用戶同意后進(jìn)行。

應(yīng)用場景

  • 視頻會議:用戶可以共享他們的屏幕或應(yīng)用程序窗口,以便在遠(yuǎn)程會議中展示內(nèi)容。
  • 直播:游戲直播者可以共享他們的游戲畫面。
  • 遠(yuǎn)程支持:技術(shù)支持人員可以請求訪問用戶的屏幕來幫助解決問題。

getDisplayMedia() 提供了一種強(qiáng)大的方式,允許Web應(yīng)用以用戶控制的方式捕獲和使用屏幕內(nèi)容。

2、快速開發(fā)一個插件

可以通過腳手架快速生成一個插件基本框架。

安裝jyeontu腳手架

npm install jyeontu

使用腳手架快速創(chuàng)建新項目

jyeontu create

選擇 Chrome 插件模板 即可

初始化

npm run init

打包

npm run build

插件開發(fā)

目標(biāo)

1、在瀏覽器中頁面右鍵菜單加上開始錄屏按鈕

2、點擊開始錄屏按鈕后彈出新頁面選擇錄取的屏幕

3、結(jié)束錄屏后輸出視頻文件

功能實現(xiàn)

1、瀏覽器右鍵菜單添加按鈕

const id = "screenRecording"; //generateRandomString(8);
chrome.contextMenus.create({
  title: "開始錄屏", //菜單的名稱
  id: id, //一級菜單的id
  contexts: ["page"], // page表示頁面右鍵就會有這個菜單,如果想要當(dāng)選中文字時才會出現(xiàn)此右鍵菜單,用:selection
});

2、監(jiān)聽右鍵菜單點擊事件

這里直接借用百度首頁做個中間頁面來觸發(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)建(打開)一個新的瀏覽器窗口,可以提供大小、位置或默認(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(); // 手動啟動錄制
}
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)前時間
  const year = now.getFullYear(); // 年份
  const month = (now.getMonth() + 1).toString().padStart(2, "0"); // 月份,加1因為月份是從0開始的
  const day = now.getDate().toString().padStart(2, "0"); // 日期
  const hours = now.getHours().toString().padStart(2, "0"); // 小時
  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實現(xiàn)一個錄屏插件的文章就介紹到這了,更多相關(guān)JavaScript錄屏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript之旅 對象的原型鏈之由來

    Javascript之旅 對象的原型鏈之由來

    本人是Javascript菜鳥,下面是前幾天學(xué)習(xí)Javascript的旅程心得,希望對和我一樣的入門者有點用,也希望高手批評指正。
    2010-08-08
  • 移動端手指放大縮小插件與js源碼

    移動端手指放大縮小插件與js源碼

    這篇文章主要介紹了移動端手指放大縮小插件與js源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 前端常用字符串/數(shù)組操作方法實例(含相關(guān)手撕)

    前端常用字符串/數(shù)組操作方法實例(含相關(guān)手撕)

    前端開發(fā)必備的10個JavaScript對象數(shù)組操作技巧,涵蓋創(chuàng)建、遍歷、篩選、轉(zhuǎn)換、排序、統(tǒng)計、去重、合并、更新和分頁等核心場景,這篇文章主要介紹了前端常用字符串/數(shù)組操作方法的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • CSS+JS實現(xiàn)點擊文字彈出定時自動關(guān)閉DIV層菜單的方法

    CSS+JS實現(xiàn)點擊文字彈出定時自動關(guān)閉DIV層菜單的方法

    這篇文章主要介紹了CSS+JS實現(xiàn)點擊文字彈出定時自動關(guān)閉DIV層菜單的方法,設(shè)計javascript操作菜單的彈出與關(guān)閉的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • webpack5 常用插件使用問題小結(jié)

    webpack5 常用插件使用問題小結(jié)

    webpack 是一個模塊打包器,這篇文章主要介紹了webpack5 常用插件使用問題小結(jié),每次打包完都需要手動刪除掉dist文件目錄,使用CleanWebpackPlugin就可自動清除dist目錄,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • js實現(xiàn)拖動滑塊效果

    js實現(xiàn)拖動滑塊效果

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)拖動滑塊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 關(guān)于Javascript作用域鏈的八點總結(jié)

    關(guān)于Javascript作用域鏈的八點總結(jié)

    其實吧,關(guān)于作用域鏈相關(guān)的文章我也看了不少,但是我一直也沒能做一個詳細(xì)的總結(jié),今天把我看到的一些東西,結(jié)合自己的想法,總結(jié)成以下8個點
    2013-12-12
  • 很酷的javascript loading效果代碼

    很酷的javascript loading效果代碼

    很不錯的loading效果代碼,方便學(xué)習(xí)loading的朋友測試與學(xué)習(xí)
    2008-06-06
  • 微信小程序云開發(fā)之使用云存儲

    微信小程序云開發(fā)之使用云存儲

    這篇文章主要為大家詳細(xì)介紹了微信小程序云開發(fā)之使用云存儲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • JavaScript獲取多個數(shù)組的交集簡單實例

    JavaScript獲取多個數(shù)組的交集簡單實例

    這篇文章介紹了JavaScript獲取多個數(shù)組的交集簡單實例,有需要的朋友可以參考一下
    2013-11-11

最新評論

治多县| 蛟河市| 泗洪县| 汉川市| 金秀| 逊克县| 孝昌县| 巨鹿县| 靖州| 稻城县| 东平县| 康乐县| 安宁市| 潞城市| 鹤壁市| 青州市| 榆社县| 仁怀市| 如皋市| 名山县| 红河县| 平谷区| 安塞县| 吴桥县| 娄烦县| 安泽县| 自贡市| 淮滨县| 鄄城县| 郁南县| 通许县| 盐边县| 梁山县| 沭阳县| 沾益县| 双城市| 翁牛特旗| 克什克腾旗| 沈阳市| 盘山县| 光山县|