Electron:摄像头录制和屏幕录制

摄像头录制

main.js

javascript 复制代码
const { app, BrowserWindow} = require('electron')


let mainWin = null
const createWindow = () => {
  mainWin = new BrowserWindow({
    width: 800,
    height: 600,
    title: '自定义菜单',
    webPreferences: {
      // 允许渲染进程使用nodejs
      nodeIntegration: true,
      // 允许渲染进程使用nodejs
      contextIsolation: false,
    }
  })
  mainWin.loadFile('index.html')
  mainWin.webContents.openDevTools()
}

app.whenReady().then(() => {
  createWindow()
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

index.html

javascript 复制代码
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8" />
  <title></title>
</head>

<body>
  <button id="openCamera">打开摄像头</button>
  <button id="start">开始录制</button>
  <button id="stop">停止录制</button>
  <button id="play">播放</button>

  <video src="" id="originVideo"></video>
  <video src="" id="playVideo" width="400" height="500"></video>

  <script>

    const openCamera = document.querySelector("#openCamera")
    const start = document.querySelector("#start")
    const stop = document.querySelector("#stop")
    const play = document.querySelector("#play")
    const originVideo = document.querySelector("#originVideo")
    const playVideo = document.querySelector("#playVideo")

    let stream;
    let blobData = []
    let recordInstance;

    openCamera.addEventListener("click", () => {
      handleOpenCamera()
    })

    start.addEventListener("click", () => {
      startRecord()
    })
    stop.addEventListener("click", () => {
      recordInstance && recordInstance.stop()
    })
    play.addEventListener("click", () => {
      const blob = new Blob(blobData, { type: 'video/mp4' })
      const videoUrl = URL.createObjectURL(blob)
      playVideo.src = videoUrl;
      playVideo.play()
    })

    // 打开摄像头
    const handleOpenCamera = async () => {
      stream = await navigator.mediaDevices.getUserMedia({
        video: {
          width: 400, height: 500
        },
        audio: true
      })
      console.log("handleOpenCamera stream", stream);
      originVideo.srcObject = stream
      originVideo.play()
    }

    //开始录制
    const startRecord = () => {
      recordInstance = new MediaRecorder(stream, { mimeType: 'video/webm' })
      console.log("startRecord stream", stream);
      if (recordInstance) {
        recordInstance.start()
        recordInstance.ondataavailable = function (e) {
          blobData.push(e.data)
        }
        recordInstance.onstop = function (e) {
          console.log("startRecord onstop");
        }
      }
    }

  </script>

</body>

</html>

屏幕录制

main.js

javascript 复制代码
const { app, BrowserWindow, desktopCapturer, session } = require('electron')


let mainWin = null
const createWindow = () => {
  mainWin = new BrowserWindow({
    width: 1000,
    height: 800,
    title: '自定义菜单',
    webPreferences: {
      // 允许渲染进程使用nodejs
      nodeIntegration: true,
      // 允许渲染进程使用nodejs
      contextIsolation: false,
    }
  })

  session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
    desktopCapturer.getSources({ types: ['screen'] }).then((sources) => {
      // Grant access to the first screen found.
      callback({ video: sources[0], audio: 'loopback' })
    })
  })

  mainWin.loadFile('index.html')
  mainWin.webContents.openDevTools()
}

app.whenReady().then(() => {
  createWindow()
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
  • index.html
javascript 复制代码
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8" />
  <title></title>
</head>

<body>
  <button id="openCamera">打开摄像头</button>
  <button id="screenRecord">屏幕录制</button>
  <button id="start">开始录制</button>
  <button id="stop">停止录制</button>
  <button id="play">播放录制的视频</button>

  <video src="" id="originVideo"></video>
  <video src="" id="playVideo" width="400" height="500"></video>

  <script>

    const openCamera = document.querySelector("#openCamera")
    const screenRecord = document.querySelector("#screenRecord")
    const start = document.querySelector("#start")
    const stop = document.querySelector("#stop")
    const play = document.querySelector("#play")
    const originVideo = document.querySelector("#originVideo")
    const playVideo = document.querySelector("#playVideo")

    let stream;
    let blobData = []
    let recordInstance;

    // 打开摄像头
    openCamera.addEventListener("click", () => {
      handleOpenCamera()
    })

    // 屏幕录制
    screenRecord.addEventListener("click", () => {
      handleScreenRecord()
    })

    // 开始录制
    start.addEventListener("click", () => {
      startRecord()
    })

    // 停止录制
    stop.addEventListener("click", () => {
      recordInstance && recordInstance.stop()
    })

    // 播放录制的视频
    play.addEventListener("click", () => {
      const blob = new Blob(blobData, { type: 'video/mp4' })
      const videoUrl = URL.createObjectURL(blob)
      playVideo.src = videoUrl;
      playVideo.play()
    })

    // 打开摄像头
    const handleOpenCamera = async () => {
      stream = await navigator.mediaDevices.getUserMedia({
        video: {
          width: 400, height: 500
        },
        audio: true
      })
      console.log("handleOpenCamera stream", stream);
      originVideo.srcObject = stream
      originVideo.play()
    }

    // 屏幕录制
    const handleScreenRecord = async () => {
      stream = await navigator.mediaDevices.getDisplayMedia({
        video: {
          width: 400, height: 500
        },
        // video: true,
        audio: true
      })
      console.log("handlescreenRecord stream", stream);
      originVideo.srcObject = stream
      originVideo.play()
    }

    //开始录制
    const startRecord = () => {
      recordInstance = new MediaRecorder(stream, { mimeType: 'video/webm' })
      console.log("startRecord stream", stream);
      if (recordInstance) {
        recordInstance.start()
        recordInstance.ondataavailable = function (e) {
          blobData.push(e.data)
        }
        recordInstance.onstop = function (e) {
          console.log("startRecord onstop");
        }
      }
    }

  </script>

</body>

</html>
相关推荐
不简说9 小时前
拖拽DIY表格插件来了!sv-print 七月更新:这次真的能自己拼表格了
前端·javascript·前端框架
ssshooter9 小时前
小程序分包页面报 "has not been registered yet" 的隐蔽根因:一个动态 import 拖垮整个分包
前端·javascript·微信小程序
鹏多多10 小时前
Web浏览器后台离线通知方案实现以及兼容指南
前端·javascript·vue.js
yangmu320310 小时前
Vue3 响应式系统深度解析:从 Proxy 到依赖追踪
前端·javascript·vue.js
Asize10 小时前
Node path 与 fs 模块:从回调地狱到 async await 的异步进化
javascript·node.js
大家的林语冰12 小时前
😭 Electron 麻了,Deno 直接支持二进制应用,无需第三方桌面应用框架!
前端·javascript·node.js
Ivanqhz12 小时前
NFM(神经因子分解机)
开发语言·javascript·人工智能·算法·蓝桥杯
用户2986985301413 小时前
在 React 中拆分 Excel 文件:从工作表到行列的实践
javascript·react.js·excel
想要成为糕糕手14 小时前
238. 除了自身以外数组的乘积 — 面试向深度解析
javascript·算法·面试
kisshyshy14 小时前
前端存储、表单异步提交与 this 指向完全指南
前端·javascript·html