2015-12-08 05:09:36 +00:00
# desktopCapturer
2015-10-04 01:35:00 +00:00
2016-07-25 10:49:25 +00:00
> Access information about media sources that can be used to capture audio and
2017-05-15 18:42:47 +00:00
> video from the desktop using the [`navigator.mediaDevices.getUserMedia`] API.
2016-07-25 10:49:25 +00:00
2020-05-21 00:25:49 +00:00
Process: [Main ](../glossary.md#main-process ), [Renderer ](../glossary.md#renderer-process )
2016-11-01 23:35:31 +00:00
2016-07-25 10:49:25 +00:00
The following example shows how to capture video from a desktop window whose
title is `Electron` :
2015-10-04 01:35:00 +00:00
```javascript
// In the renderer process.
2018-09-13 16:10:51 +00:00
const { desktopCapturer } = require('electron')
2015-10-04 01:35:00 +00:00
2019-01-18 23:29:32 +00:00
desktopCapturer.getSources({ types: ['window', 'screen'] }).then(async sources => {
2018-10-16 17:41:42 +00:00
for (const source of sources) {
if (source.name === 'Electron') {
try {
const stream = await navigator.mediaDevices.getUserMedia({
audio: false,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: source.id,
minWidth: 1280,
maxWidth: 1280,
minHeight: 720,
maxHeight: 720
}
2015-10-06 06:34:54 +00:00
}
2018-10-16 17:41:42 +00:00
})
handleStream(stream)
} catch (e) {
handleError(e)
}
2016-07-26 01:39:25 +00:00
return
2015-10-06 06:34:54 +00:00
}
2015-10-04 01:35:00 +00:00
}
2016-07-26 01:39:25 +00:00
})
2015-10-04 01:35:00 +00:00
2016-07-26 16:49:02 +00:00
function handleStream (stream) {
2017-08-18 19:32:03 +00:00
const video = document.querySelector('video')
video.srcObject = stream
video.onloadedmetadata = (e) => video.play()
2015-10-04 01:35:00 +00:00
}
2016-07-26 16:49:02 +00:00
function handleError (e) {
2016-07-26 01:39:25 +00:00
console.log(e)
2015-10-04 01:35:00 +00:00
}
```
2016-07-25 10:49:25 +00:00
To capture video from a source provided by `desktopCapturer` the constraints
2017-05-15 18:38:32 +00:00
passed to [`navigator.mediaDevices.getUserMedia`] must include
2016-07-25 10:49:25 +00:00
`chromeMediaSource: 'desktop'` , and `audio: false` .
2015-12-15 22:07:55 +00:00
2016-07-25 10:49:25 +00:00
To capture both audio and video from the entire desktop the constraints passed
2017-05-15 18:42:47 +00:00
to [`navigator.mediaDevices.getUserMedia`] must include `chromeMediaSource: 'desktop'` ,
for both `audio` and `video` , but should not include a `chromeMediaSourceId` constraint.
2017-05-15 18:45:14 +00:00
```javascript
2017-05-15 18:42:47 +00:00
const constraints = {
audio: {
mandatory: {
chromeMediaSource: 'desktop'
}
},
video: {
mandatory: {
chromeMediaSource: 'desktop'
}
}
2017-05-15 20:38:57 +00:00
}
2017-05-15 18:42:47 +00:00
```
2015-12-15 22:07:55 +00:00
2020-05-26 20:34:24 +00:00
This example shows how to capture a video from a [WebContents ](web-contents.md )
```javascript
// In the renderer process.
const { desktopCapturer, remote } = require('electron')
desktopCapturer.getMediaSourceIdForWebContents(remote.getCurrentWebContents().id).then(async mediaSourceId => {
try {
const stream = await navigator.mediaDevices.getUserMedia({
audio: {
mandatory: {
chromeMediaSource: 'tab',
chromeMediaSourceId: mediaSourceId
}
},
video: {
mandatory: {
chromeMediaSource: 'tab',
chromeMediaSourceId: mediaSourceId,
minWidth: 1280,
maxWidth: 1280,
minHeight: 720,
maxHeight: 720
}
}
})
handleStream(stream)
} catch (e) {
handleError(e)
}
})
function handleStream (stream) {
const video = document.querySelector('video')
video.srcObject = stream
video.onloadedmetadata = (e) => video.play()
}
function handleError (e) {
console.log(e)
}
```
2015-10-06 06:34:54 +00:00
## Methods
2015-10-04 01:35:00 +00:00
2015-10-06 06:34:54 +00:00
The `desktopCapturer` module has the following methods:
2015-10-04 01:35:00 +00:00
2019-01-18 23:29:32 +00:00
### `desktopCapturer.getSources(options)`
* `options` Object
* `types` String[] - An array of Strings that lists the types of desktop sources
to be captured, available types are `screen` and `window` .
* `thumbnailSize` [Size ](structures/size.md ) (optional) - The size that the media source thumbnail
2019-02-13 18:27:42 +00:00
should be scaled to. Default is `150` x `150` . 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.
2019-01-18 23:29:32 +00:00
* `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` ](structures/desktop-capturer-source.md ) objects, each `DesktopCapturerSource` represents a screen or an individual window that can be captured.
2019-11-13 21:47:51 +00:00
**Note** Capturing the screen contents requires user consent on macOS 10.15 Catalina or higher,
which can detected by [`systemPreferences.getMediaAccessStatus`].
2020-05-26 20:34:24 +00:00
### `desktopCapturer.getMediaSourceIdForWebContents(webContentsId)`
* `webContentsId` number - Id of the WebContents to get stream of
Returns `Promise<string>` - Resolves with the identifier of a WebContents stream, this identifier can be
used with [`navigator.mediaDevices.getUserMedia`].
The identifier is **only valid for 10 seconds** .
The identifier may be empty if not requested from a renderer process.
2019-01-18 23:29:32 +00:00
[`navigator.mediaDevices.getUserMedia`]: https://developer.mozilla.org/en/docs/Web/API/MediaDevices/getUserMedia
2019-11-13 21:47:51 +00:00
[`systemPreferences.getMediaAccessStatus`]: system-preferences.md#systempreferencesgetmediaaccessstatusmediatype-macos
2019-04-16 17:49:31 +00:00
2019-05-06 15:29:01 +00:00
## Caveats
2019-04-16 17:49:31 +00:00
`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 ](https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/KernelExtensions/KernelExtensions.html ). 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` .