Appearance
PC 出力音声の取得方法(Windows / macOS)
🤖 AI補完 — Notion の作業記録 PC出力音声取得方法(OS別) を元に、OS別の実装方針を比較表形式で整理しています。
「PC が再生している音声」を Electron アプリ等から取得する方法を OS 別に整理。 画面共有と一緒にシステム出力音をキャプチャしたいケース、ネイティブで低遅延・低レベル制御したいケース、 古い OS をサポートしたいケース、それぞれに合わせた手段を比較。
結論サマリ
| OS | 推奨第一候補 | 推奨第二候補 |
|---|---|---|
| Windows | Electron desktopCapturer の loopback (audio: 'loopback') | WASAPI loopback recording(ネイティブ) |
| macOS 14.2 以上 | Electron desktopCapturer + NSAudioCaptureUsageDescription | ScreenCaptureKit ネイティブ |
| macOS 13.x – 14.1 | Electron 標準で検証 → 不足なら ScreenCaptureKit | ScreenCaptureKit ネイティブ |
| macOS 12.7.6 以下 | 仮想オーディオデバイス経由(BlackHole / Soundflower) | — |
Windows 版
方法 1. Electron の loopback capture を使う(推奨)
用途: Electron アプリで画面共有と一緒に PC 出力音を取りたい / 実装コストを抑えたい
概要:
session.setDisplayMediaRequestHandler()でaudio: 'loopback'を返す- Electron 公式では
loopbackとloopbackWithMuteが定義されている - loopback による system audio capture は現在 Windows のみ対応
注意点:
- 取得対象は「物理スピーカー」ではなく「レンダリングエンドポイントで再生されているシステム出力音」
- 画面キャプチャ許可の流れと一緒に扱う設計になる
参考:
方法 2. WASAPI loopback を使う
用途: Windows ネイティブ寄り、低レベル制御が必要 / Electron でも Node アドオンや別ネイティブプロセスで高い制御性が欲しい
概要:
- Windows の Core Audio / WASAPI に loopback recording がある
- レンダリングエンドポイントに対して loopback モードで capture stream を開く
IAudioCaptureClientから PCM を取得
向いているケース:
- 低レベル制御・デバイス選択・フォーマット制御・低遅延化を詰めたい
注意点:
- Electron だけで完結しないことが多い → C++ アドオンや別実行ファイルとの連携が必要
参考:
macOS 版
方法 1. Electron desktopCapturer を使う
用途: Electron ベースを維持したい / macOS 13 以降の system audio capture を狙いたい
概要:
- Electron 公式では、macOS 13 以降は Apple が desktop audio capture 用 API を提供する前提
- macOS 14.2 以上では
NSAudioCaptureUsageDescriptionを Info.plist に追加する必要がある - Electron 最新系では Chromium が Apple の CoreAudio Tap API を既定利用
注意点:
- macOS 14.2 以上で
NSAudioCaptureUsageDescriptionがないと、音声付きストリームが死んだ状態になることがある - 必要に応じて
MacCatapLoopbackAudioForScreenShareを無効化して旧来の permission 系へ戻す方法も Electron 公式から案内されている - Windows のように
audio: 'loopback'だけで済む、という整理ではない
参考:
方法 2. ScreenCaptureKit をネイティブで使う
用途: macOS ネイティブ API を正面から使いたい / Electron の抽象化よりも macOS 側の制御を優先したい
概要:
- Apple 公式の ScreenCaptureKit は screen と audio を stream 出力できる
SCStreamConfiguration.capturesAudio = trueで audio capture を有効化SCStreamOutputType.audioで audio sample buffer を受ける
向いているケース:
- macOS 版だけ別実装にしてもよい
- 権限・音声サンプル処理・録音品質を細かく制御したい
注意点:
- Electron から直接ではなく、ネイティブブリッジや別プロセス実装が必要になりやすい
- Windows とコードパスが分かれる
参考:
- Apple ScreenCaptureKit overview
- Apple capturesAudio
- Apple SCStreamOutputType.audio
- Apple sample guidance
方法 3. 仮想オーディオデバイス経由
用途: macOS 12 系以前も対象にしたい / Electron 単体の制約を回避したい
概要:
- 仮想オーディオデバイスに system output を回す
- その仮想デバイスを
getUserMedia({ audio: true })の入力元として扱う - Electron 公式でも、macOS 12.7.6 以下の回避策として BlackHole や Soundflower が例示されている
向いているケース:
- 古い macOS をサポートしたい
- 多少セットアップ手順が増えてもよい
注意点:
- ユーザーに追加セットアップを求めることになる
- オーディオルーティング設計が必要
参考:
プロジェクトに当てはめた場合の意思決定
Windows
今の方針どおり loopback 取得 が最も自然。
macOS
Windows と同じ実装をそのまま流用するのではなく、少なくとも次の 3 パターンに分けて考えるのが安全:
- macOS 14.2 以上
- Electron
desktopCapturerを試す NSAudioCaptureUsageDescriptionを追加する
- Electron
- macOS 13.x – 14.1
- Electron 標準で足りるか検証
- 足りなければ ScreenCaptureKit ネイティブ連携
- macOS 12.7.6 以下
- 仮想オーディオデバイス前提
ひとことでまとめると
- Windows は loopback が本命
- macOS は OS バージョンと Electron の権限要件次第で方法を分ける
- 両 OS を本気で安定対応するなら、Windows と macOS で音声取得レイヤーを分離した設計がよい