暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

让我们用 JavaScript 创建一个录屏程序

前端新世界 2022-02-16
723
喜欢就关注我们吧


OBS录屏软件很酷,但我们也可以使用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>

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

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

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

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

好的,现在替换console.log
,显示视频信息流。

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

btn.addEventListener("click"async function ({
  let stream = await navigator.mediaDevices.getDisplayMedia({
    videotrue
  });
});

现在,如果你点击按钮,你会看到这个弹出窗口。

你可能认为我们已经选定了窗口或屏幕并单击了共享,然后应该可以开始录制了?还不行,还要更复杂一些。我们必须自己录制视频。这里我们使用MediaRecorder
来录制。

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

btn.addEventListener("click"async function ({
  let stream = await navigator.mediaDevices.getDisplayMedia({
    videotrue
  })

  //判断浏览器是否支持
  const mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9"
             ? "video/webm; codecs=vp9" 
             : "video/webm"
    let mediaRecorder = new MediaRecorder(stream, {
        mimeType: mime
    })

    //开始手动录制
    mediaRecorder.start()
})

当录制屏幕时,mediaRecorder
将以块的形式为我们提供数据,我们需要将这些数据存储在一个变量中。

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

btn.addEventListener("click"async function ({
  let stream = await navigator.mediaDevices.getDisplayMedia({
    videotrue
  })

  //判断浏览器是否支持
  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.start()
})

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

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

btn.addEventListener("click"async function ({
  let stream = await navigator.mediaDevices.getDisplayMedia({
    videotrue
  })

  //判断浏览器是否支持
  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)
  })

    //开始手动录制
    mediaRecorder.start()
})

最后,自动下载录制的视频。

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

btn.addEventListener("click"async function ({
  let stream = await navigator.mediaDevices.getDisplayMedia({
    videotrue
  })

  //判断浏览器是否支持
  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()
  })

    //开始手动录制
    mediaRecorder.start()
})

现在我们有了一个功能齐全的录屏应用程序。撒花!

感谢大家的阅读。我们下次再见。

每日分享前端插件干货,欢迎关注!

点赞和在看就是最大的支持❤️

文章转载自前端新世界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论