5.1 KiB
desktopCapturer
Access information about media sources that can be used to capture audio and video from the desktop using the
navigator.mediaDevices.getUserMedia
API.
Process: Main
The following example shows how to capture video from a desktop window whose
title is Electron
:
// main.js
const { app, BrowserWindow, desktopCapturer, session } = require('electron')
app.whenReady().then(() => {
const mainWindow = new BrowserWindow()
session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
// If we should use the system picker
// Note: this is currently experimental
if (desktopCapturer.isDisplayMediaSystemPickerAvailable()) {
callback({ video: desktopCapturer.systemPickerVideoSource })
return
}
desktopCapturer.getSources({ types: ['screen'] }).then((sources) => {
// Grant access to the first screen found.
callback({ video: sources[0], audio: 'loopback' })
})
})
mainWindow.loadFile('index.html')
})
// renderer.js
const startButton = document.getElementById('startButton')
const stopButton = document.getElementById('stopButton')
const video = document.querySelector('video')
startButton.addEventListener('click', () => {
navigator.mediaDevices.getDisplayMedia({
audio: true,
video: {
width: 320,
height: 240,
frameRate: 30
}
}).then(stream => {
video.srcObject = stream
video.onloadedmetadata = (e) => video.play()
}).catch(e => console.log(e))
})
stopButton.addEventListener('click', () => {
video.pause()
})
<!-- index.html -->
<html>
<meta http-equiv="content-security-policy" content="script-src 'self' 'unsafe-inline'" />
<body>
<button id="startButton" class="button">Start</button>
<button id="stopButton" class="button">Stop</button>
<video width="320" height="240" autoplay></video>
<script src="renderer.js"></script>
</body>
</html>
See navigator.mediaDevices.getDisplayMedia
for more information.
Note: navigator.mediaDevices.getDisplayMedia
does not permit the use of deviceId
for
selection of a source - see specification.
Methods
The desktopCapturer
module has the following methods:
desktopCapturer.getSources(options)
options
Objecttypes
string[] - An array of strings that lists the types of desktop sources to be captured, available types can bescreen
andwindow
.thumbnailSize
Size (optional) - The size that the media source thumbnail should be scaled to. Default is150
x150
. Set width or height to 0 when you do not need the thumbnails. This will save the processing time required for capturing the content of each window and screen.fetchWindowIcons
boolean (optional) - Set to true to enable fetching window icons. The default value is false. When false the appIcon property of the sources return null. Same if a source has the type screen.
Returns Promise<DesktopCapturerSource[]>
- Resolves with an array of DesktopCapturerSource
objects, each DesktopCapturerSource
represents a screen or an individual window that can be captured.
Note Capturing the screen contents requires user consent on macOS 10.15 Catalina or higher,
which can detected by systemPreferences.getMediaAccessStatus
.
desktopCapturer.isDisplayMediaSystemPickerAvailable()
Experimental
Returns Boolean
, whether or not requesting desktop content via
the system picker is supported on this platform.
Currently this will only return true
on macOS 14.4 and higher. When
true you should respect this value and use systemPickerVideoSource
as
otherwise the OS may present scary warning dialogs to your users.
Properties
desktopCapturer.systemPickerVideoSource
Experimental Readonly
A DesktopCapturerSource
property that should be used in conjunction with
session.setDisplayMediaRequestHandler
to use the system picker instead
of providing a specific video source from getSources
.
Caveats
navigator.mediaDevices.getUserMedia
does not work on macOS for audio capture due to a fundamental limitation whereby apps that want to access the system's audio require a signed kernel extension. Chromium, and by extension Electron, does not provide this.
It is possible to circumvent this limitation by capturing system audio with another macOS app like Soundflower and passing it through a virtual audio input device. This virtual device can then be queried with navigator.mediaDevices.getUserMedia
.