通过谷歌搜索结果,没有一种广为人知的方法可以从Microsoft Windows上的特定应用程序捕获音频,至少不必求助于变通方法,例如将音频从一个进程发送到单独的虚拟音频环回设备(然而,这会导致无法听到声音,除非您使用硬件环回播放设备或通过主输出"收听"模拟输入(。
这些解决方案很笨重,需要为每个特定的应用程序和软件进行配置,如果在执行过程中更改了输出设备,软件通常会表现不佳,不再成功发出任何声音或直接停止工作。与此同时,发起了一场"Discord";实时流媒体";会话允许您轻松无故障地通过VoIP群呼共享单个应用程序的声音。来自其他应用程序的声音已完全删除。从音频设备来看,似乎没有发生虚拟环回路由,客户端的音频播放绝对没有中断。该功能在macOS或Linux版本的软件上不可用,仅在Windows上可用。因此,在Win32中,从特定进程捕获声音是可能的,但为什么没有其他人这样做呢?比如说,在像OBS或Audacity这样非常有用的软件分支中实现这样的东西需要什么?
特别是,我觉得这是有用的信息:
这与挂接Direct3D非常相似。挂接IAudioRenderClient接口,并截取GetBuffer以读取音频样本。
初级逆向工程时间!
此外,我不能给出一个明确的答案,但我可以引导你朝着正确的方向前进。
Discord的根目录中有一个名为modulesdiscord_hook
的目录,在这里我们可以发现有一个JavaScript文件,名称为index.js
,一个json文件,名称manifest.json
,一个.node
文件,名称discord_hook.node
(它是编译/加密的,我不能读取(,一个包含.dll
s和.exe
s的目录,它还生成了一个日志文件,名称叫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
s、.dll
s、discord_hook.node
、index.js
及其本身。
前面提到的.node文件在很大程度上是人类无法读取的。
hook.log
没有输出任何看似有用的东西,只是关于图形/视频共享的东西。
这让我们只能查看子目录中的exe
和dll
文件,我对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中。他们还在底部链接了他们用来记录它的东西。
祝你好运,我希望所有这些信息能在某种程度上有所帮助!