c++ - 直接渲染到 WASAPI 时,两个流之一没有音频输出

标签 c++ audio visual-c++ wasapi

几周来我一直被这个问题困扰,Google 也帮不上忙,所以希望这里的一些人能帮助我。

我正在用 C++ 编写软件混音器,从网络和 Windows 麦克风获取音频数据包,将它们混合在一起作为 PCM,然后通过网络将它们发送回扬声器/USB 耳机。这行得通。我有一个使用 PortAudio 库来处理与 Windows 的接口(interface)的工作设置。但是,我的主管认为该软件和我们的系统之间的延迟可以减少,因此为了降低延迟(并更好地处理 USB 耳机断开连接),我现在正在重写 Windows 接口(interface)层以直接使用 WASAPI。为此,我可以消除一些缓冲区和回调,并且理论上可以使用超低延迟接口(interface)(如果它仍然不够快,无法满足高层要求的话)。

我现在只有部分工作,而部分工作正是让我在这里崩溃的原因。我们的系统将扬声器和耳机作为三个独立的单声道音频流。扬声器是单声道的,耳机是从两个流组合成立体声的。我将其作为两个流输出到 Windows,一个用于用户选择的扬声器设备,另一个用于用户选择的耳机设备。为了进行测试,它们都输出到我系统上的默认通用立体声混音。

我可以很好地听到扬声器的声音,但无论我如何尝试,我都听不到耳机的声音。它们都使用相同的代码路径,它们都通过 WMF 重采样器以 Windows 需要的采样率转换为 2 声道音频。但是我可以听到扬声器的声音,但听不到耳机的声音。

这不是独占模式问题:我在所有流上使用共享模式,我什至专门尝试将流减少到只有耳机,以防一个人踩另一个或其他东西,但耳机仍然存在没有音频输出。

这不是上游的混音器问题,因为我没有修改任何代码,因为它与 PortAudio 流一起工作。我可以看到音频通过混音器并通过我的调试可视化工具输出。

当系统回调请求音频时,我可以看到数据进入我从系统获取的缓冲区。我应该听到一些东西,甚至是静态的,但我什么也没听到。 (有一次,我完全绕过了环形缓冲区,在回调中将随机数直接放入缓冲区,但仍然没有声音。)

我在这里做错了什么?似乎 Windows 本身就是问题所在,但我没有 Windows API 方面的专业知识知道什么,而且我显然是我公司中这方面的最专家。我什至还没有研究为什么麦克风输入不起作用,我已经坚持了几个星期了。如果有人有任何建议,我们将不胜感激。

最佳答案

检查重采样流:将立体声流输出到扬声器,将单声道流输出到听筒。

使用 IAudioClient::IsFormatSupported 检查手机支持的格式。

使用 mp3 文件验证您的代码。使用两个媒体播放器同时在不同设备上播放不同文件。

关于c++ - 直接渲染到 WASAPI 时,两个流之一没有音频输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847684/

相关文章:

c++ - 使用相同的for循环以升序或降序遍历 map

c++ - Abort() 已被调用 - Connect Function multithreads Cpp

c# - C#XNA SoundEffect.FromStream

c++ - 如何从 c c++ 中具有多个路径的字符串中提取文件路径?

c++ - 为什么我不能使用 auto 声明变量?

c++ - 从方法返回引用

c++ - 在 C++ 中使用外部文件创建数组

audio - 使用Wolfram播放功能

windows - Windows 10:使用2个麦克风而不混合输入

c++ - 反转生成的 vtable 函数顺序(具有相同名称的函数)