Discord はどのようにして特定のプロセスのオーディオに接続するのでしょうか? 質問する

Discord はどのようにして特定のプロセスのオーディオに接続するのでしょうか? 質問する

Google の検索結果を調べてみると、少なくとも、あるプロセスから別の仮想オーディオ ループバック デバイスにオーディオを送信するなどの回避策に頼らなくても、Microsoft Windows 上の特定のアプリケーションからオーディオをキャプチャする方法は広く知られていません (ただし、ハードウェア ループバック再生デバイスを使用するか、メイン出力を介してエミュレートされた入力を「聞く」場合を除き、サウンドを聞くことができなくなります)。

これらの回避策は扱いにくく、特定のアプリケーションごとに設定が必要で、ソフトウェアは実行中に出力デバイスが変更されると、誤動作したり、音が出なくなったり、動作しなくなったりすることがよくあります。一方、不和「ライブ ストリーミング」セッションを使用すると、単一のアプリケーションのサウンドを VoIP グループ通話で簡単に、確実に共有できます。他のアプリケーションのサウンドは完全に削除されます。オーディオ デバイスを見ると、仮想ループバック ルーティングは行われていないようで、クライアント側でのオーディオ再生にはまったく中断がありません。この機能は、ソフトウェアの macOS または Linux バージョンでは利用できず、Windows でのみ利用できます。特定のプロセスからサウンドをキャプチャすることは Win32 で可能ですが、なぜ他の誰もこれを行わないのでしょうか。たとえば、OBS や Audacity のように、このような機能が非常に役立つソフトウェアのフォークでこのような機能を実装するには何が必要ですか。

ベストアンサー1

編集: これが役に立つかどうかはわかりませんが、次のページを見つけました:https://obsproject.com/forum/threads/audio-sources.465/

特に、これは私にとって役立つ情報だと思います:

これは Direct3D をフックするのと非常に似ています。IAudioRenderClient インターフェイスをフックし、GetBuffer をインターセプトしてオーディオ サンプルを読み取ります。

初心者のリバースエンジニアリングタイム!

また、明確な答えを出すことはできませんが、正しい方向に導くことはできます。

Discord のルート ディレクトリ内には というディレクトリがあり\modules\discord_hook、ここに という名前の JavaScript ファイル、index.jsという名前の json ファイルmanifest.json、という.node名前のファイルdiscord_hook.node(コンパイル/暗号化されているため読み取れません)、 および を含むディレクトリがあり.dll.exeという名前のログ ファイルも生成されますhook.log

index.js単にロードしてdiscord_hook.node、私たちにとって重要ではない他のいくつかのことを実行するだけのように見えます。

Google で検索するとmanifest.jsonここにたどり着きます:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json

このmanifest.jsonファイルは、WebExtension API を使用するすべての拡張機能に含まれている必要がある唯一のファイルです。

ファイルでは、 、、、およびそれ自体.jsonを参照していることがわかります。.exe.dlldiscord_hook.nodeindex.js

前述のように、.node ファイルの大部分は人間には読み取れません。

hook.log一見役に立つような出力はなく、グラフィック/ビデオ共有に関する情報のみが表示されます。

exeこれで、サブディレクトリ内のおよびファイルの内部を調べることになりますdllが、 については何も知りませんasmが、これらのバイナリ内に残されたいくつかの文字列を調べることはできます。

オフセット 1266B4 からオフセット 126EA6 のオーディオを参照する文字列のセクションを見つけましたDiscordHook.dll(これは Discord の将来のバージョンで変更される可能性があり、ほぼ確実に変更されます)

ここで投稿する価値があると思われる文字列をいくつか示します。

Audio buffer stopped, WASAPI capture stopping
Failed to get format of WASAPI audio buffer, not capturing, error code [%d]
Failed to get WASAPI audio client from render client, not capturing
Starting capture of WASAPI buffer with sample rate %d, depth %d, %d channels
Starting capture of Windows Sonic stream with downmix sample rate %d, depth %d, %d channels
ISpatialAudioObjectRenderStream::Stop
ISpatialAudioObjectRenderStream::BeginUpdatingAudioObjects
ISpatialAudioObjectRenderStream::EndUpdatingAudioObjects
ISpatialAudioObject::GetBuffer
HookWasapi failed to load audioses.dll
WaveFormatFromRenderClient failed with error code [%d]
LoadWASAPIOffsets failed with error code [%d]
WASAPI module sizes don't match (expected: %lu, actual: %lu)
WASAPI offsets invalid (stop: %lu, getBuffer: %lu, releaseBuffer: %lu, clientOffset: %lu, endpointOffset: %lu)
WASAPI offsets out of bounds (size: %lu, stop: %lu, getBuffer: %lu, releaseBuffer: %lu)
IAudioClient::Stop
IAudioRenderClient::GetBuffer
IAudioRenderClient::ReleaseBuffer
HookWasapi: MH_ApplyQueued failed 0x%x

また、「hook process audio」をグーグルで検索したところ、次のものを見つけました:https://ywjheart.wordpress.com/2017/02/26/audio-captureapihook-based-for-obs-studio/

コード例やダウンロードは提供されていませんが、OBS で同じことを実行する方法についていくつか説明されています。また、下部に、ドキュメント化に使用した資料へのリンクもあります。

頑張ってください。この情報が何らかの形で役立つことを願っています。

おすすめ記事