windows - 同时将声音输出到多个音频设备

标签 windows audio openal simultaneous directsound

好,第一个问题。我正在尝试编写一个虚拟的音板,该音板将一次输出到多个设备。我希望使用OpenAL,但是如果我必须切换到MS库(我最初是在Windows 7上编写的),则可以。

无论如何,您的想法是要加载一堆声音文件并准备播放。您使用的是Skype,并且某人主要失败,因此您按了价格正确的失败按钮。您和您的 friend 都同时听到此声音,并对此大笑。

我已经将OAL设置为可以在默认设备上播放的程度,此时选择一个设备似乎很简单。但是,据我了解,每个OAL设备都需要其上下文是最新的,以便缓冲区能够正确填充/传播。这意味着,在标准程序中,声音将在一个设备上播放,然后切换该设备,然后将缓冲的声音在第二个设备上播放。

任何音频库都可以做到吗?是否会涉及线程,这些线程是否安全?

然后,下一个问题是,为了使其与最终用户设置无缝集成,它需要能够输出到默认的录音设备,或拦截录音设备,将其与声音混合,然后输出作为另一个播放设备。这两种方法都有可能吗?如果两者都可行,哪一种方法更可行?我认为最好是能够输出到录音设备本身,因为那样的话,程序就不必运行即可让麦克风仍然可以通话。

最佳答案

如果我理解得很好,这里主要有两个问题。

  • 是否可以在两个或多个音频输出设备上同时播放声音,如何实现?
  • 是否可以通过音频输入(记录)设备环回数据,以便在相应的监视器上播放,例如在您的情况下通过Skype的音频流发送给您的伴侣。

  • 答案1:这是绝对可行的,系统的所有独立音频输出都可以同时播放声音。例如,某些专业音频接口(interface)(用于音乐制作)具有8、16、64个独立的输出,所有这些输出都可以同时播放声音。这意味着每个输出设备都维护自己独立使用的缓冲区(除了并发共享缓冲区的最终共享内存)。

    怎么样?

    大多数音频框架/系统都提供了获取“设备句柄”的功能,这将需要您传递回调以将样本提供给缓冲区(例如,Open AL)。框架/系统(最终是音频设备驱动程序)将独立和异步地调用此方法。
    由于这一切都是异步进行的,因此您在这里不一定需要多线程。原则上您需要做的就是维护两个(或多个)音频输出设备句柄,每个句柄具有一个单独的缓冲区消耗回调,以馈送两个(或多个)单独的设备。

    注意您也可以在一台设备上播放几种声音。大多数设备/系统都允许这种“资源共享”。实际上,这就是制造声卡的目的之一。将各种程序产生的所有声音混合在一起(从而减轻了CPU的沉重负担)。当您使用一个(物理)设备播放多个声音时,其概念与使用多个设备相同。对于每种声音,您都有一个逻辑设备句柄。只有那些句柄引用一个物理设备的多个“通道”。

    你应该用什么?

    我想说,开放式AL有点像使用重型火炮来完成此简单任务(因为您不希望有那么大的可移植性,并且可能不打算实现自己的编解码器和效果;))

    我建议您在这里使用Qt。它具有高度的可移植性(Win / Mac / Linux),并且具有非常方便的类(class),可以为您完成这项工作:http://qt-project.org/doc/qt-5.0/qtmultimedia/qaudiooutput.html

    请查看文档中的示例,以了解如何通过几行代码来播放WAV文件。要同时播放多个WAV文件,您只需要打开几个QAudioOutput(基本上将示例中的代码放入函数中,然后根据需要多次调用即可)。请注意,必须关闭/停止QAudioOutput才能停止播放声音。

    答案2:您要执行的操作称为回送。仅非常有限数量的声卡,即音频设备提供了所谓的回送输入设备,这将允许记录例如声卡的主要输出混合当前输出的内容。但是,即使提供了这种设备,也不允许您将任何内容循环回到麦克风输入设备。麦克风输入设备仅从麦克风D / A转换器获取数据。这是在硬件的深处,您不能在那里混入任何水平的东西。

    话虽如此,让Skype将具有标准设置的声音发送给对话伙伴将非常非常困难(恕我直言,实际上是不可能的)。我唯一能想到的就是拥有一个具有环回功能的音频设备(或者简单地将一条物理电缆连接一条可能的监视器线连接到任何记录线),然后将Skype设置为将此环回设备用作输入。 。但是,Skype不会再从您的麦克风接听,因此,您将无法进行通话;)

    注意:在这里说“同时”播放时,我们正在谈论的是根据实时感知(在10-20ms范围内)同步两种声音的播放。我们不在样本级别上查看实际的同步,而是在将声音发送到具有两个独立(自由运行)时钟的两个物理设备上时出现的相关时钟抖动和相移问题。因此,当应用程序需要在独立设备上生成相位信号时,就需要时钟恢复机制,该机制可由驱动程序或OS提供。

    注意:虚拟音频设备软件(例如Virtual Audio Cable)将提供虚拟设备以在Windows中实现回送功能。诸如Jack Audio之类的框架可以在UX环境中实现相同的目的。

    关于windows - 同时将声音输出到多个音频设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20917684/

    相关文章:

    安卓 : Switching audio between Bluetooth and Phone Speaker is inconsistent

    c++ - ALSA:如何通过耳机和扬声器发送音频

    audio - 如何在OpenAL中设置 channel 增益?

    c++ - 使用 OpenAL(Stream) 播放声音

    windows - 有没有办法做一个异步FindNextFile?

    windows - 删除除 X 个最近的文件夹以外的所有文件夹

    android-studio - Android Studio模拟器音量低

    java - OpenAL WaveData 错误

    c# - 控制台应用程序在 visual studio 中打开后立即关闭

    c++ - 服务和注册