几周来我一直被这个问题困扰,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/