Electron采集桌面共享和系统音频(桌面捕获)实例

 更新时间:2023年10月18日 09:54:19   作者:Sean  
这篇文章主要为大家介绍了Electron采集桌面共享和系统音频(桌面捕获)实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Electron 开发音视频

在使用 Electron 开发音视频项目的时候,我们不可避免会 遇到桌面共享这种场景。

webRTC 提供了, getUserMedia 方法用于采集 用户媒体数据。比如摄像头,麦克风。

设置主进程信息

我们需要先在Electron 中,先创建窗体并载入入口 index 文件。

代码如下:

const { app, BrowserWindow, desktopCapturer, ipcMain } = require('electron')
const path = require('path')
let win = null;
function createWindow () {
  win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })
  win.loadFile('index.html')
}
app.whenReady().then(() => {
  createWindow()
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

使用 desktopCapturer 模块

desktopCapturer 模块是Electron 提供的官方模块用于捕获系统桌面。 desktopCapture 支持捕获,应用窗口 和 桌面两种媒体源。

但是,此模块有使用限制,需要在主进程进行调用。 所以我们需要用到 Electron 中进行间通信的方式。

所以我们需要通过, IPC 通讯的形式,让我们,在渲染进程中进行调用。

首先,我们在 main.js 中,通过 ipcMain 注册一个方法,getSources

// .... other code 
ipcMain.handle('getSources', async () => {
  return await desktopCapturer.getSources({ types: ['window', 'screen'] })
})

接着,我们在渲染进程中,通过 ipcRenderer 去invoke 调用此方法便实现了,这个调用过程。

// .... other codes
const inputSources = await ipcRenderer.invoke('getSources')
// ... other codes

获得source 列表后, 我们在渲染进程中,通过 HTML5 的 getUserMedia 进行捕获具体窗口或者桌面。

示例代码:

// ...
// other Code 
 let constraints = {
      audio: {
        mandatory: {
          chromeMediaSource: 'desktop'
        }
      },
      video: {
        mandatory: {
          chromeMediaSource: 'desktop',
          chromeMediaSourceId: sourceId
        }
      }
    }
    const stream = await navigator.mediaDevices
      .getUserMedia(constraints);
      handleStream(stream);
function handleStream (stream) {
    const video = document.querySelector('video')
    video.srcObject = stream
    video.onloadedmetadata = (e) => video.play()
  }
// ...
// other code

至此我们就完成了, 桌面视频数据采集了。

后续我们,可以对采集到的数据进行 ,本地录制或者 通过webrtc 推到远端等一系列操作。

总结

在electron 中实现桌面共享 和 chrome web 中差异还是蛮大的, 在chrome 中我们只需要调用 getDisplayMedia 方法就能唤起桌面选择和画面采集。

但在electron 中,我们需要使用到, 进程间通信模块 ipc 、 桌面采集模块 desktopCapturer 、以及HTML5 的getUserMedia 方法才能完成整个桌面采集的过程。

关于完整代码,我上传到了github。

DEMO 代码: https://github.com/shitouzxy/Electron-screenCapturerer-demo

以上就是Electron采集桌面共享和系统音频(桌面捕获)实例的详细内容,更多关于Electron桌面捕获的资料请关注脚本之家其它相关文章!

相关文章

  • vue 自动检测手机端响应式布局的五种实现

    vue 自动检测手机端响应式布局的五种实现

    本文主要介绍了vue自动检测手机端响应式布局,可以通过结合 CSS 媒体查询、Vue 的动态数据绑定、适当的第三方库、PostCSS 插件以及正确的视口设置实现,感兴趣的可以了解一下
    2024-07-07
  • Vue自定义铃声提示音组件的实现

    Vue自定义铃声提示音组件的实现

    这篇文章主要介绍了Vue中自定义一个铃声提示音组件的实现以及使用方法,文中的示例代码讲解详细,对我们学习Vue有一定帮助,需要的可以参考一下
    2022-01-01
  • vue路由划分模块并自动引入方式

    vue路由划分模块并自动引入方式

    这篇文章主要介绍了vue路由划分模块并自动引入方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue中的同步和异步调用顺序详解

    Vue中的同步和异步调用顺序详解

    这篇文章主要介绍了Vue中的同步和异步调用顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Vue.js图片滑动验证的实现示例

    Vue.js图片滑动验证的实现示例

    为了防止有人恶意使用脚本进行批量操作,会设置图片滑动验证,本文就介绍了Vue.js图片滑动验证的实现示例,感兴趣的可以了解一下
    2023-05-05
  • vue如何动态修改$router参数

    vue如何动态修改$router参数

    这篇文章主要介绍了vue如何动态修改$router参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 详解无限滚动插件vue-infinite-scroll源码解析

    详解无限滚动插件vue-infinite-scroll源码解析

    这篇文章主要介绍了详解无限滚动插件vue-infinite-scroll源码解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 安装vue无法运行、此系统无法运行脚本问题及解决

    安装vue无法运行、此系统无法运行脚本问题及解决

    这篇文章主要介绍了安装vue无法运行、此系统无法运行脚本问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 将vue3项目打包后部署在springboot项目运行图文教程

    将vue3项目打包后部署在springboot项目运行图文教程

    这篇文章主要介绍了将vue3项目打包后部署在springboot项目运行的相关资料,文中通过代码及图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-11-11
  • vue.js路由mode配置之去掉url上默认的#方法

    vue.js路由mode配置之去掉url上默认的#方法

    今天小编就为大家分享一篇vue.js路由mode配置之去掉url上默认的#方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11

最新评论