Skip to content

PC 出力音声の取得方法(Windows / macOS)

🤖 AI補完 — Notion の作業記録 PC出力音声取得方法(OS別) を元に、OS別の実装方針を比較表形式で整理しています。

「PC が再生している音声」を Electron アプリ等から取得する方法を OS 別に整理。 画面共有と一緒にシステム出力音をキャプチャしたいケース、ネイティブで低遅延・低レベル制御したいケース、 古い OS をサポートしたいケース、それぞれに合わせた手段を比較。


結論サマリ

OS推奨第一候補推奨第二候補
WindowsElectron desktopCapturer の loopback (audio: 'loopback')WASAPI loopback recording(ネイティブ)
macOS 14.2 以上Electron desktopCapturer + NSAudioCaptureUsageDescriptionScreenCaptureKit ネイティブ
macOS 13.x – 14.1Electron 標準で検証 → 不足なら ScreenCaptureKitScreenCaptureKit ネイティブ
macOS 12.7.6 以下仮想オーディオデバイス経由(BlackHole / Soundflower)

Windows 版

方法 1. Electron の loopback capture を使う(推奨)

用途: Electron アプリで画面共有と一緒に PC 出力音を取りたい / 実装コストを抑えたい

概要:

  • session.setDisplayMediaRequestHandler()audio: 'loopback' を返す
  • Electron 公式では loopbackloopbackWithMute が定義されている
  • 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 とコードパスが分かれる

参考:

方法 3. 仮想オーディオデバイス経由

用途: macOS 12 系以前も対象にしたい / Electron 単体の制約を回避したい

概要:

  • 仮想オーディオデバイスに system output を回す
  • その仮想デバイスを getUserMedia({ audio: true }) の入力元として扱う
  • Electron 公式でも、macOS 12.7.6 以下の回避策として BlackHoleSoundflower が例示されている

向いているケース:

  • 古い macOS をサポートしたい
  • 多少セットアップ手順が増えてもよい

注意点:

  • ユーザーに追加セットアップを求めることになる
  • オーディオルーティング設計が必要

参考:


プロジェクトに当てはめた場合の意思決定

Windows

今の方針どおり loopback 取得 が最も自然。

macOS

Windows と同じ実装をそのまま流用するのではなく、少なくとも次の 3 パターンに分けて考えるのが安全:

  1. macOS 14.2 以上
    • Electron desktopCapturer を試す
    • NSAudioCaptureUsageDescription を追加する
  2. macOS 13.x – 14.1
    • Electron 標準で足りるか検証
    • 足りなければ ScreenCaptureKit ネイティブ連携
  3. macOS 12.7.6 以下
    • 仮想オーディオデバイス前提

ひとことでまとめると

  • Windows は loopback が本命
  • macOS は OS バージョンと Electron の権限要件次第で方法を分ける
  • 両 OS を本気で安定対応するなら、Windows と macOS で音声取得レイヤーを分離した設計がよい