desktopCapturer
navigator.mediaDevices.getUserMediaAPIを使用して、デスクトップからの音声と映像のキャプチャに利用できるメディアソース関連の情報にアクセスします。
プロセス: メイン
以下の例では、タイトルが Electron であるデスクトップウインドウからビデオをキャプチャする方法を示します。
// main.js
const { app, BrowserWindow, desktopCapturer, session } = require('electron')
app.whenReady().then(() => {
const mainWindow = new BrowserWindow()
session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
desktopCapturer.getSources({ types: ['screen'] }).then((sources) => {
// 最初に見つけた画面へのアクセスを認可します。
callback({ video: sources[0], audio: 'loopback' })
})
// true ならば、利用可能な場合にシステムのピッカーを使用します。
// 注: 現在これは実験的なものです。 システムピッカーが
// 利用可能な場合はそれが使用され、メディアのリクエストハンドラ
// は呼び出されません。
}, { useSystemPicker: true })
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>
詳しくは navigator.mediaDevices.getDisplayMedia を参照してください。
navigator.mediaDevices.getDisplayMedia はソースの選択に deviceId を使用できません。このことについては 仕様 を参照してください。
メソッド
desktopCapturer モジュールには以下のメソッドがあります。
desktopCapturer.getSources(options)
戻り値 Promise<DesktopCapturerSource[]> - DesktopCapturerSource オブジェクトの配列で解決します。各 DesktopCapturerSource は、キャプチャできる画面または個々のウィンドウを表します。
- Capturing audio requires
NSAudioCaptureUsageDescriptionInfo.plist key on macOS 14.2 Sonoma and higher - read more.- Capturing the screen contents requires user consent on macOS 10.15 Catalina or higher, which can detected by
systemPreferences.getMediaAccessStatus.
Caveats
Linux
Linux では、Pipewire を使用する場合 desktopCapturer.getSources(options) は単一のソースのみを返します。
PipeWire は、スクリーンとウインドウの両方に対して一つのキャプチャをサポートしています。 ウインドウとスクリーンのタイプを要求すると、選択したソースがウインドウキャプチャとして返されます。
MacOS versions 14.2 or higher
NSAudioCaptureUsageDescription Info.plist key must be added in-order for audio to be captured by desktopCapturer. If instead you are running electron from another program like a terminal or IDE then that parent program must contain the Info.plist key.
This is in order to facillitate use of Apple's new CoreAudio Tap API by Chromium.
[!WARNING] Failure of
desktopCapturerto start an audio stream due toNSAudioCaptureUsageDescriptionpermission not present will still create a dead audio stream however no warnings or errors are displayed.
As of electron v39.0.0-beta.4 Chromium made Apple's new CoreAudio Tap API the default for desktop audio capture. There is no fallback to the older Screen & System Audio Recording permissions system even if CoreAudio Tap API stream creation fails.
If you need to continue using Screen & System Audio Recording permissions for desktopCapturer on macOS versions 14.2 and later, you can apply a chromium feature flag to force use of that older permissions system:
// main.js (right beneath your require/import statments)
app.commandLine.appendSwitch('disable-features', 'MacCatapLoopbackAudioForScreenShare')
MacOS versions 12.7.6 or lower
navigator.mediaDevices.getUserMedia does not work on macOS versions 12.7.6 and prior for audio capture due to a fundamental limitation whereby apps that want to access the system's audio require a signed kernel extension. Chrome、ひいては Electron はこれを提供していません。 Only in macOS 13 and onwards does Apple provide APIs to capture desktop audio without the need for a signed kernel extension.
It is possible to circumvent this limitation by capturing system audio with another macOS app like BlackHole or Soundflower and passing it through a virtual audio input device. この仮想デバイスは、 navigator.mediaDevices.getUserMedia.を使用して照会できます。