前端实现录屏

... 2025-7-10 Code 大约 1 分钟

# 1、录屏保存

<body>
  <video class="video" width="600px" controls></video>
  <button class="record-btn">记录</button>

  <script>
    let btn = document.querySelector('.record-btn')

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

      // 需要更好的浏览器支持
      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)
        console.log(chunks)
      })

      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.mp4';
        // a.click()
      })

      // 必须手动启动
      mediaRecorder.start()
    })
  </script>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 2、录屏实时预览

<video id="test" autoplay></video>
<script>
  navigator.mediaDevices
    .getDisplayMedia({ video: true })
    .then((stream) => {
      document.getElementById('test').srcObject = stream
    })
    .catch((error) => {
      console.log(error)
    })
</script>
1
2
3
4
5
6
7
8
9
10
11

# 3、Vue3 中使用,预览和保存

// 录制后的URL地址 可赋值给video标签,供展示;也可赋值给a标签,供下载
let URL = ''
navigator.mediaDevices
  .getDisplayMedia({ video: true })
  .then((stream) => {
    // 开始录制
    nextTick(() => {
      // #video1:预览的video标签ID 注意添加autoplay属性
      document.getElementById('video1').srcObject = stream
      let mimeType = MediaRecorder.isTypeSupported('video/webm; codecs=vp9')
        ? 'video/webm; codecs=vp9'
        : 'video/webm'
      mediaRecorder = new MediaRecorder(stream, { mimeType })
      let chunks = []
      mediaRecorder.addEventListener('dataavailable', (e) =>
        chunks.push(e.data)
      )
      mediaRecorder.addEventListener('stop', function () {
        // 停止录制
        let blob = new Blob(chunks, { type: chunks[0].type })
        URL = URL.createObjectURL(blob)
        nextTick(() => {
          // #video2:录制完成后展示的video标签ID
          document.getElementById('video2').src = URL
        })
      })
      mediaRecorder.start()
    })
  })
  .catch((error) => {
    console.log(error)
    if (String(error).indexOf('Permission denied')) {
      // 录制请求被拒绝
    }
  })

// 下载的 也可在#video2中设置controls属性,内置下载
function download() {
  let a = document.createElement('a')
  a.href = URL
  a.download = `网页录制-${new Date().toLocaleString()}.mp4`
  a.click()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
上次编辑于: 2025年7月10日 04:01
贡献者: HugStars