录屏

点击页面捕获和录制按钮,进行录屏

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name          录屏
// @namespace     https://blog.csdn.net/mukes
// @version       0.0.1
// @description  点击页面捕获和录制按钮,进行录屏
// @author       zhansheng
// @include      *.100bm.cn
// @include      *.blog.csdn.net/article/details/*
// ==/UserScript==
(function() {
    'use strict';
    let videoBuffer = []
  let mediaRecorder
  let recording = false

  async function getMediaStream(stream) {
    window.$stream = stream
  }

  async function startCapture(displayMediaOptions) {
    let captureStream = null;
    try {
      captureStream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
    } catch (err) {
      console.error("Error: " + err);
    }
    return captureStream;
  }

  async function start() {
    if (!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia) {
      console.log('getUserMedia is not supported')
    } else {
      const displayMediaOptions = {
        video: true,
        audio: false,
      }

      let captureStream = await startCapture(displayMediaOptions)
      await getMediaStream(captureStream)
    }

  }

  function handleDataAvailable(e) {
    if (e && e.data && e.data.size > 0) {
      videoBuffer.push(e.data)
    }
  }

  async function record(even) {
    let $target = even.target
    if (recording) {
      stopRecord()
      $target.innerText = '录制'
    } else {
      startRecord()
    }
  }

  function startRecord() {
    videoBuffer = []
    const options = {
      mimeType: 'video/webm; codecs = vp8',
    }

    if(!window.$stream){
        alert('请先捕获屏幕')
        return
    }

    if (!MediaRecorder.isTypeSupported(options.mimeType)) {
      console.error('${options.mimeType} is not supported!')
      return
    }

    try {
      mediaRecorder = new MediaRecorder(window.$stream, options)
    } catch (e) {
      console.error('Failed to create MediaRecorder:', e)
      return
    }
    
    mediaRecorder.ondataavailable = handleDataAvailable
    mediaRecorder.start(10)
    recording = true
    document.querySelector("#luzhi").innerText = '结束'
  }

  function stopRecord() {
    mediaRecorder.stop()
    recording = false
    downRecord()
  }

  // 下载录制
  function downRecord() {
    const blob = new Blob(videoBuffer, { type: 'video/webm' })
    const url = window.URL.createObjectURL(blob)
    const a = document.createElement('a')
    const fileName = new Date().toLocaleString()
    a.href = url
    a.style.display = 'none'
    a.download = `${fileName}.mp4`
    a.click()
  }

  function init() {
    // js 构造相关按钮
    // 构造 开始捕获屏幕按钮
    let button_start = document.createElement('div')
    button_start.style.position = 'absolute'
    button_start.style.top = '0px'
    button_start.style.left = '0px'
    button_start.style.zIndex = 999
    button_start.style.width = '50px'
    button_start.style.height = '50px'
    button_start.style.borderRadius = '50%'
    button_start.style.background = 'pink'
    button_start.innerText = '捕获'
    button_start.style.textAlign = 'center'
    button_start.style.lineHeight = '50px'
    button_start.style.fontSize = '15px'
    button_start.setAttribute('id', 'start')

    // 构造 录制(结束)按钮
    let button_luzhi = document.createElement('div')
    button_luzhi.style.position = 'absolute'
    button_luzhi.style.top = '80px'
    button_luzhi.style.left = '0px'
    button_luzhi.style.zIndex = 999
    button_luzhi.style.width = '50px'
    button_luzhi.style.height = '50px'
    button_luzhi.style.borderRadius = '50%'
    button_luzhi.style.background = 'blue'
    button_luzhi.innerText = '录制'
    button_luzhi.style.textAlign = 'center'
    button_luzhi.style.lineHeight = '50px'
    button_luzhi.style.fontSize = '15px'
    button_luzhi.setAttribute('id', 'luzhi')

    document.body.appendChild(button_start)
    document.body.appendChild(button_luzhi)


    document.querySelector("#start").addEventListener('click', start)
    document.querySelector("#luzhi").addEventListener("click", record)
  }

  init()
    
})(); //(function(){})() 表示该函数立即执行