web-dev-qa-db-ja.com

Mac OS X仮想オーディオドライバー

デフォルトの出力(出力IOAudioStream)からオーディオデータを取得し、それを入力IOAudioStreamに変換する仮想オーディオデバイスを作成します。

私が見つけることができるほとんどの例を調べましたが、出力IOAudioStreamを最大で入力1にコピーする機能しか実装していません。つまり、オーディオデバイスが出力として選択されている場合にのみ、オーディオを入力ストリームに変換します。

ScreenFlowでは、仮想ドライバーを作成するkextをインストールすることでコンピューターのオーディオを録音できるため、これが可能になります。

既定の出力からオーディオデータにアクセスして仮想ドライバーに送信するにはどうすればよいですか?

26
UpL1nK

オープンソース WavTap を見てください。これは、オープンソース SoundFlower 仮想サウンドカードドライバーの単純化されたフォークです。それは、あなたが望むものを実質的に行うと信じている.kextです。

参考までに、一般的な商用クローズドソースオプションの仕組みを以下に示します。
Rogue Amoeba's Audio Hijack Pro
-オープンソースのSoundFlower .kextに基づくコードを介してシステムオーディオをキャプチャします
-アプリケーションの起動時に、通常のCoreAudio.frameworkを「パッチ」フレームワークに置き換えて、アプリケーションのオーディオをキャプチャします
-Unsanityのhaxie "Application Enhancer"(APE)の助けを借りて、既に実行中のアプリケーションのオーディオをキャプチャします。

これらの機能は、「Instant On」機能(InstantOn.kext)としてブランド化されています。

Ambrosia Softwareの WireTap Studio
-社内開発の.kextを介してシステムオーディオとアプリケーションオーディオをキャプチャします。

Telestreamの ScreenFlow
- 社内開発の.kext。 を介してシステムオーディオをキャプチャします(バージョン2.xはvaraudio.kextを使用し、バージョン3.xはTelestreamAudio.kextを使用します)

Macsome's Audio Recorder
-不明な方法

Araelium Groupの Screenflick
-SoundFlower .kextを使用してシステムオーディオをキャプチャします

更新#1
著者のコメントを読んだ後、基本的な目標はシステムサウンドをキャプチャできるようにすることであるようですwithoutデバイスとして仮想オーディオドライバーを公開する(システム設定のリストに表示されます) )およびwithout現在のデフォルト出力デバイスの変更(または少なくともデバイスが変更された外観)。

SoundFlower:インストール時にサウンドデバイスをリストに追加します
WavTap:インストール時にリストにサウンドデバイスを追加します。 WavTapアプリケーションの起動時にデバイスを自動選択します。アプリケーションのシャットダウン時にデバイスの自動選択を解除し、前のデバイスを再選択します
Audio Hijack Pro:デフォルトのシステムサウンドのオーディオキャプチャが選択されている場合にのみ、サウンドデバイスを追加します。オーディオキャプチャが選択されなくなったときにサウンドデバイスを削除し、前のデバイスを再選択します
WireTap Studio:不明
ScreenFlow:現在のデフォルトの出力デバイスを変更せず、デバイスとして仮想オーディオドライバーを公開せずにシステムサウンドをキャプチャします

更新#2
ジェフムーアの引用、CoreAudio Appleエンジニア、WireTapやAudio Hijack Proなどのアプリケーションを参照:
「特定のアプリまたはミックス全体をハードウェアに出力するAPIがシステム上にありません... [システムサウンドのキャプチャ]はシステムでサポートされていませんMac OS Xのオーディオシステムは、何よりもまずパフォーマンスのために設計されたものです。パフォーマンスのペナルティを課すことなく、必要な機能をサポートするのが容易ではない設計です。そのため、この機能を提供できないという犠牲を払ってパフォーマンスの向上を選択しました。 "

この件についてさらに詳しく知りたい場合は、CoreAudio APIメーリングリストで次のスレッドをご覧ください。
「WireTap、CoreAudioのAPI、およびシステムキャプチャ、およびkexts ...」
「ソフトウェアによって再生されるオーディオのキャプチャに関する別の質問」
「MacでCoreAudioを使用して現在再生されているオーディオをキャプチャする」
"'audio Hijack'"
「ワイヤータップのようなモニタリングシステムのオーディオ出力」
「ファイルへのオーディオ出力のキャプチャ」
「ミラーリングオーディオ出力」
「録音システムのオーディオ」

関連するSO質問:
コードレスkextを使用したオーディオデバイスの非表示

要するに、これを実現するAppleの例は見当たりません。また、誰かがそう感じているのでなければ、これを実現するオープンソースコードも見当たりません。 非常に寛大、情報の価値が高すぎるようです。

48
BigMacAttack

追加の調査の後、目標を達成できる可能性のある、私が思いついたいくつかの理論的手法を以下に示します。

  1. Prosoft Engineeringの Hear 製品と同様に、.kext(カーネルモード仮想ドライバー)ではなくHALプラグイン(ユーザーモード仮想ドライバー)を作成できます。 。 Appleには "SampleHardwarePlugIn" および PulseAudio もありますが、彼の方法では、事前に混合されたシステムサウンドストリームにアクセスできるとは思いません。 CoreAudioを使用してサウンドを再生します)、それらを一緒にミックスして擬似システムサウンドキャプチャを行います。

  2. 非表示の仮想オーディオデバイスを作成する [1][2] ユーザーインタラクションから。ユーザーがデフォルトのサウンドをキャプチャしたい場合、 プログラムで、隠し仮想デバイスと現在のデフォルトのサウンドデバイスを含む集約デバイス を作成します。この集約デバイスをデフォルトの出力として一時的に設定します。この方法で、デフォルトのサウンドをキャプチャし、それを聞くことができます。
    注意:Mac OS Xで非表示のデバイスをデフォルトの出力デバイスとして設定できる場合、システム環境設定は選択したデバイスとして何を表示しますか?代わりにセカンダリ出力デバイスが選択されているように表示される場合は、何も変更されていないという追加の暗示があります。

8
BigMacAttack