让我们用 JS 创建一个屏幕录像机

2025-05-24

让我们用 JS 创建一个屏幕录像机

OBS Studio 很酷,但让我们用 JavaScript 创建我们自己的屏幕录像机吧。
猜猜怎么着?它不仅限于录制浏览器屏幕。是的,你没看错。虽然 JavaScript 是在浏览器上运行的,但我们可以使用 JS 录制活动标签页,甚至录制任何标签页或整个屏幕。那就让我们开始吧。
首先我们需要一个HTML文件,其中包含一个录制按钮和一个视频元素,用于播放录制的视频。



<!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <video class="video" width="600px" controls></video>
    <button class="record-btn">record</button>

    <script src="./index.js"></script>
  </body>
</html>


Enter fullscreen mode Exit fullscreen mode

我们还需要一个 JS 文件,所以让我们也创建index.js



let btn = document.querySelector(".record-btn");

btn.addEventListener("click", function () {
  console.log("hello");
});



Enter fullscreen mode Exit fullscreen mode

所以现在如果我们打开浏览器并单击按钮,我们应该hello在控制台中看到。

好的,现在让console.log我们获取用户流显示



let btn = document.querySelector(".record-btn");

btn.addEventListener("click", async function () {
  let stream = await navigator.mediaDevices.getDisplayMedia({
    video: true
  });
});


Enter fullscreen mode Exit fullscreen mode

所以现在如果你点击按钮你就会看到这个弹出窗口。
屏幕录制弹出窗口

现在你可能以为我们已经完成了,选择一个窗口或屏幕,点击“共享”,它应该就会开始录制了。但实际操作起来要复杂一些。我们必须自己录制视频。我们将使用MediaRecorder来录制视频。



let btn = document.querySelector(".record-btn")

btn.addEventListener("click", async function () {
  let stream = await navigator.mediaDevices.getDisplayMedia({
    video: true
  })

  //needed for better browser support
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") 
             ? "video/webm; codecs=vp9" 
             : "video/webm"
    let mediaRecorder = new MediaRecorder(stream, {
        mimeType: mime
    })

    //we have to start the recorder manually
    mediaRecorder.start()
})


Enter fullscreen mode Exit fullscreen mode

因此,当我们的屏幕被记录下来时,mediaRecorder我们会以块的形式提供数据,我们需要将这些数据存储在一个变量中。



let btn = document.querySelector(".record-btn")

btn.addEventListener("click", async function () {
  let stream = await navigator.mediaDevices.getDisplayMedia({
    video: true
  })

  //needed for better browser support
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") 
             ? "video/webm; codecs=vp9" 
             : "video/webm"
    let mediaRecorder = new MediaRecorder(stream, {
        mimeType: mime
    })

    let chunks = []
    mediaRecorder.addEventListener('dataavailable', function(e) {
        chunks.push(e.data)
    })

    //we have to start the recorder manually
    mediaRecorder.start()
})


Enter fullscreen mode Exit fullscreen mode

现在,当我们点击停止共享按钮时,我们希望录制的视频在我们的视频元素中播放,所以让我们这样做。



let btn = document.querySelector(".record-btn")

btn.addEventListener("click", async function () {
  let stream = await navigator.mediaDevices.getDisplayMedia({
    video: true
  })

  //needed for better browser support
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") 
             ? "video/webm; codecs=vp9" 
             : "video/webm"
    let mediaRecorder = new MediaRecorder(stream, {
        mimeType: mime
    })

    let chunks = []
    mediaRecorder.addEventListener('dataavailable', function(e) {
        chunks.push(e.data)
    })

    mediaRecorder.addEventListener('stop', function(){
      let blob = new Blob(chunks, {
          type: chunks[0].type
      })

      let video = document.querySelector(".video")
      video.src = URL.createObjectURL(blob)
  })

    //we have to start the recorder manually
    mediaRecorder.start()
})


Enter fullscreen mode Exit fullscreen mode

现在,作为最后的润色,让我们自动下载录制的视频。



let btn = document.querySelector(".record-btn")

btn.addEventListener("click", async function () {
  let stream = await navigator.mediaDevices.getDisplayMedia({
    video: true
  })

  //needed for better browser support
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") 
             ? "video/webm; codecs=vp9" 
             : "video/webm"
    let mediaRecorder = new MediaRecorder(stream, {
        mimeType: mime
    })

    let chunks = []
    mediaRecorder.addEventListener('dataavailable', function(e) {
        chunks.push(e.data)
    })

    mediaRecorder.addEventListener('stop', function(){
      let blob = new Blob(chunks, {
          type: chunks[0].type
      })
      let url = URL.createObjectURL(blob)

      let video = document.querySelector("video")
      video.src = url

      let a = document.createElement('a')
      a.href = url
      a.download = 'video.webm'
      a.click()
  })

    //we have to start the recorder manually
    mediaRecorder.start()
})


Enter fullscreen mode Exit fullscreen mode

现在我们有了一个功能齐全的屏幕录像机应用程序。

请务必阅读我的其他文章。


文章来源:https://dev.to/0shuvo0/lets-create-a-screen-recorder-with-js-3leb
PREV
为什么以及如何从 Visual Studio Code 迁移到 VSCodium
NEXT
让我们用 JS 创建一个绘图应用程序