Electron采集桌面共享和系統(tǒng)音頻(桌面捕獲)實(shí)例

Electron 開(kāi)發(fā)音視頻
在使用 Electron 開(kāi)發(fā)音視頻項(xiàng)目的時(shí)候,我們不可避免會(huì) 遇到桌面共享這種場(chǎng)景。
webRTC 提供了, getUserMedia 方法用于采集 用戶媒體數(shù)據(jù)。比如攝像頭,麥克風(fēng)。
設(shè)置主進(jìn)程信息
我們需要先在Electron 中,先創(chuàng)建窗體并載入入口 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 提供的官方模塊用于捕獲系統(tǒng)桌面。 desktopCapture 支持捕獲,應(yīng)用窗口 和 桌面兩種媒體源。
但是,此模塊有使用限制,需要在主進(jìn)程進(jìn)行調(diào)用。 所以我們需要用到 Electron 中進(jìn)行間通信的方式。
所以我們需要通過(guò), IPC 通訊的形式,讓我們,在渲染進(jìn)程中進(jìn)行調(diào)用。
首先,我們?cè)?main.js 中,通過(guò) ipcMain 注冊(cè)一個(gè)方法,getSources
// .... other code
ipcMain.handle('getSources', async () => {
return await desktopCapturer.getSources({ types: ['window', 'screen'] })
})接著,我們?cè)阡秩具M(jìn)程中,通過(guò) ipcRenderer 去invoke 調(diào)用此方法便實(shí)現(xiàn)了,這個(gè)調(diào)用過(guò)程。
// .... other codes
const inputSources = await ipcRenderer.invoke('getSources')
// ... other codes獲得source 列表后, 我們?cè)阡秩具M(jìn)程中,通過(guò) HTML5 的 getUserMedia 進(jìn)行捕獲具體窗口或者桌面。
示例代碼:
// ...
// 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至此我們就完成了, 桌面視頻數(shù)據(jù)采集了。
后續(xù)我們,可以對(duì)采集到的數(shù)據(jù)進(jìn)行 ,本地錄制或者 通過(guò)webrtc 推到遠(yuǎn)端等一系列操作。
總結(jié)
在electron 中實(shí)現(xiàn)桌面共享 和 chrome web 中差異還是蠻大的, 在chrome 中我們只需要調(diào)用 getDisplayMedia 方法就能喚起桌面選擇和畫(huà)面采集。
但在electron 中,我們需要使用到, 進(jìn)程間通信模塊 ipc 、 桌面采集模塊 desktopCapturer 、以及HTML5 的getUserMedia 方法才能完成整個(gè)桌面采集的過(guò)程。
關(guān)于完整代碼,我上傳到了github。
DEMO 代碼: https://github.com/shitouzxy/Electron-screenCapturerer-demo
以上就是Electron采集桌面共享和系統(tǒng)音頻(桌面捕獲)實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于Electron桌面捕獲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue 自動(dòng)檢測(cè)手機(jī)端響應(yīng)式布局的五種實(shí)現(xiàn)
本文主要介紹了vue自動(dòng)檢測(cè)手機(jī)端響應(yīng)式布局,可以通過(guò)結(jié)合 CSS 媒體查詢、Vue 的動(dòng)態(tài)數(shù)據(jù)綁定、適當(dāng)?shù)牡谌綆?kù)、PostCSS 插件以及正確的視口設(shè)置實(shí)現(xiàn),感興趣的可以了解一下2024-07-07
Vue.js圖片滑動(dòng)驗(yàn)證的實(shí)現(xiàn)示例
為了防止有人惡意使用腳本進(jìn)行批量操作,會(huì)設(shè)置圖片滑動(dòng)驗(yàn)證,本文就介紹了Vue.js圖片滑動(dòng)驗(yàn)證的實(shí)現(xiàn)示例,感興趣的可以了解一下2023-05-05
vue如何動(dòng)態(tài)修改$router參數(shù)
這篇文章主要介紹了vue如何動(dòng)態(tài)修改$router參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
詳解無(wú)限滾動(dòng)插件vue-infinite-scroll源碼解析
這篇文章主要介紹了詳解無(wú)限滾動(dòng)插件vue-infinite-scroll源碼解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
安裝vue無(wú)法運(yùn)行、此系統(tǒng)無(wú)法運(yùn)行腳本問(wèn)題及解決
這篇文章主要介紹了安裝vue無(wú)法運(yùn)行、此系統(tǒng)無(wú)法運(yùn)行腳本問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
將vue3項(xiàng)目打包后部署在springboot項(xiàng)目運(yùn)行圖文教程
這篇文章主要介紹了將vue3項(xiàng)目打包后部署在springboot項(xiàng)目運(yùn)行的相關(guān)資料,文中通過(guò)代碼及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-11-11
vue.js路由mode配置之去掉url上默認(rèn)的#方法
今天小編就為大家分享一篇vue.js路由mode配置之去掉url上默認(rèn)的#方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11

