Discord如何钩取特定进程的音频?

23

通过谷歌搜索结果,没有一种被广泛知晓的方法可以在Microsoft Windows上从特定应用程序捕获音频,至少不需要借助解决方法(例如将音频从一个进程发送到单独的虚拟音频回环设备),这会导致无法听到声音,除非您使用硬件回环播放设备或通过主输出“侦听”模拟输入)。

这些解决方法很笨重,需要为每个特定应用程序进行配置,并且软件通常会出现故障,如果它们的输出设备在执行过程中更改,则不再能够成功发出任何声音或直接停止工作。同时,启动Discord“实时流”会话允许您轻松、无故障地与VoIP群组通话共享单个应用程序的声音。来自其他应用程序的声音完全消失。查看音频设备,似乎没有任何虚拟回环路由正在发生,并且客户端的音频播放绝对没有任何中断。该功能在软件的macOS或Linux版本中不可用,仅适用于Windows。因此,在Win32中捕获特定进程的声音是可能的,但为什么没有其他人这样做呢?如果在软件的分支中实现这样的功能非常有用,比如OBS或Audacity,需要什么呢?


@IInspectable WASAPI仅支持从所有系统设备组合中呈现输出。它发生在音频接口内的硬件级别,因此无法用于独立捕获进程。让我困扰的是,这可以以一种始终可靠的方式实现:Discord就做到了。但似乎没有关于这个问题的具体信息。 - Manchineel
1
嗨,我在这个问题上添加了赏金。我想知道在macOS上如何完成。谢谢。 - jedt
@drikoda 感谢您在此上添加赏金。我认为 macOS 上不支持应用程序音频捕获。 - Manchineel
@ShayRibera 我说的是 Discord,在 Mac 上没有像 Windows 版本那样的功能。 - Manchineel
1
@phoenixstudio 我的电脑没有Realtek音频(没有内置音频驱动程序),我使用的是Focusrite Scarlett 4i4,绝对不是Discord所用的音频接口。但是这个功能仍然可以使用。我相信所有硬件都支持这个功能。 - Manchineel
显示剩余4条评论
1个回答

8

编辑:不确定这是否有用,但我找到了这个页面:https://obsproject.com/forum/threads/audio-sources.465/

特别是下面的内容似乎很有用:

它与挂钩Direct3D非常相似。您可以挂接IAudioRenderClient接口,并拦截GetBuffer以读取音频样本。

初学者的反向工程时间!

此外,我无法给出明确的答案,但我可以指导您方向。

Discord在其根目录中有一个名为\modules\discord_hook的目录,在其中我们可以找到一个JavaScript文件,名为index.js,一个名为manifest.json的json文件,一个.node文件,名为discord_hook.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处找到了一节引用音频的字符串(这在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

另外,我谷歌搜索了“钩子处理音频”,找到了这个链接: https://ywjheart.wordpress.com/2017/02/26/audio-captureapihook-based-for-obs-studio/ 它没有给出任何代码示例或下载链接,但是它描述了在OBS中完成此操作的一些内容。他们还在底部链接了相关资源。 祝你好运,希望这些信息能够在某种程度上帮到你!

1
看起来 .node 文件是外部库,使用 node-gyp 在 Node.js 中导入的。 - Steffo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接