簡體   English   中英

Discord 如何連接到特定進程的音頻?

[英]How does Discord hook into a specific process's audio?

通過 Google 搜索結果,沒有廣為人知的方法可以從 Microsoft Windows 上的特定應用程序中捕獲音頻,至少不必求助於變通方法,例如將音頻從一個進程發送到單獨的虛擬音頻環回設備(然而這會導致無法聽到聲音,除非您使用硬件環回播放設備或通過主輸出“收聽”模擬輸入)。

這些變通方法很笨拙,需要為每個特定的應用程序進行配置,並且軟件通常會出現錯誤行為,如果在執行期間更改其輸出設備,則不再成功發出任何聲音或直接停止工作。 同時,啟動Discord “實時流媒體”會話可讓您輕松無故障地與 VoIP 群組通話共享單個應用程序的聲音。 來自其他應用程序的聲音被完全刪除。 看音頻設備,似乎沒有發生虛擬環回路由,客戶端音頻播放絕對零中斷。 該功能在 macOS 或 Linux 版本的軟件上不可用,僅在 Windows 上可用。 因此,在 Win32 中可以從特定進程捕獲聲音,但為什么其他人不這樣做呢? 比如說,在一個非常有用的軟件分支中實現這樣的東西需要什么,比如 OBS 或 Audacity?

編輯:不確定這是否有用,但我找到了這個頁面: https : //obsproject.com/forum/threads/audio-sources.465/

特別是,這對我來說是有用的信息:

這與掛鈎 Direct3D 非常相似。 您掛鈎 IAudioRenderClient 接口,並攔截 GetBuffer 以讀取音頻樣本。

初學者的逆向工程時間!

另外,我不能給出明確的答案,但我可以引導你走向正確的方向。

Discord 在它的根目錄中有一個名為\\modules\\discord_hook的目錄,在這里我們可以找到一個名為index.js的 JavaScript 文件,一個名為manifest.json的 json 文件,一個名為discord_hook.node.node文件(這是編譯/加密,我無法讀取),一個包含.dll.exe的目錄,它還生成一個名為hook.log的日志文件。

index.js似乎只是加載discord_hook.node並做一些其他對我們不重要的事情。

谷歌搜索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不輸出任何看似有用的東西,只是關於圖形/視頻共享的內容。

這讓我們不得不查看這里子目錄中的exedll文件,我不知道asm ,但我們可以查看這些二進制文件中留下的一些字符串。

我在 DiscordHook.dll 中找到了一段引用偏移量 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 中執行此操作的內容。 他們還在底部鏈接了他們用來記錄它的東西。

祝你好運,我希望所有這些信息都能在某種程度上有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM