メインコンテンツへ飛ぶ

desktopCapturer

navigator.mediaDevices.getUserMedia APIを使用して、デスクトップからの音声と映像のキャプチャに利用できるメディアソース関連の情報にアクセスします。

プロセス: メイン

以下の例では、タイトルが 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 を参照してください。

note

navigator.mediaDevices.getDisplayMedia はソースの選択に deviceId を使用できません。このことについては 仕様 を参照してください。

メソッド

desktopCapturer モジュールには以下のメソッドがあります。

desktopCapturer.getSources(options)

  • options Object
    • types string[] - キャプチャされるデスクトップソースの種別を列挙した文字列の配列。指定できる種別は、screenwindow です。
    • thumbnailSize Size (任意) - メディアソースのサムネイルをスケーリングするサイズ。 省略値は 150 x 150 です。 サムネイルが不要な場合は、幅または高さを 0 に設定してください。 これにより、各ウィンドウおよび画面のコンテンツをキャプチャするために必要な処理時間が節約されます。
    • fetchWindowIcons boolean (任意) - ウインドウアイコンの取得を有効にするには true に設定します。 デフォルト値は false です。 false の場合、ソースの appIcon プロパティは null を返します。 ソースが screen 型の場合も同様です。

戻り値 Promise<DesktopCapturerSource[]> - DesktopCapturerSource オブジェクトの配列で解決します。各 DesktopCapturerSource は、キャプチャできる画面または個々のウィンドウを表します。

note
  • Capturing audio requires NSAudioCaptureUsageDescription Info.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 desktopCapturer to start an audio stream due to NSAudioCaptureUsageDescription permission 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.を使用して照会できます。