同时向多个音频设备输出声音

时间:2014-01-04 06:14:39

标签: windows audio openal simultaneous directsound

好的,第一个问题。我正在尝试编写一个可以同时输出到多个设备的虚拟音板。我更喜欢OpenAL,但如果我必须切换到MS库(我最初在Windows 7上写这个),我会的。

无论如何,这个想法是你有一堆声音文件加载并准备播放。你在Skype上,有人以一种主要方式失败,所以你点击Price is Right fail ditty上的播放按钮。你和你的朋友都在同一时间听到这个声音,并且笑得很开心。

我已经获得了OAL,我可以在默认设备上播放,此时选择设备似乎相当微不足道。但是,据我所知,每个OAL设备都需要其上下文是最新的,以便缓冲区正确填充/传播。这意味着,在标准程序中,声音将在一个设备上播放,然后设备将被切换,然后缓冲声音然后在第二个设备上播放。

这有可能,任何音频库?线程是否会涉及,那些会安全吗?

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

2 个答案:

答案 0 :(得分:2)

如果我理解的话,这里有两个问题,主要是。

  1. 是否可以同时在两个或多个音频输出设备上播放声音,以及如何实现此目的?

  2. 是否可以通过音频输入(录制)设备回送数据,以便在相应的监视器上播放,例如通过Skype的音频流发送给您的合作伙伴,在您的相应情况下。 / p>

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

    如何?

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

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

    您应该使用什么?

    打开AL似乎有点像使用重型火炮来执行这个简单的任务(因为你不希望那个很多可移植性,并且可能不打算实现你自己的编解码器和效果;))< / p>

    我建议你在这里使用Qt。它具有高度可移植性(Win / Mac / Linux),它有一个非常方便的课程,可以帮助你:http://qt-project.org/doc/qt-5.0/qtmultimedia/qaudiooutput.html

    查看文档中的示例,了解如何使用几行代码播放WAV文件。要同时播放多个WAV文件,您只需打开几个QAudioOutput(基本上将示例中的代码放在一个函数中,并根据需要随时调用它)。请注意,您必须关闭/停止QAudioOutput以便声音停止播放。

    回答2:您要做的事情称为环回。只有非常有限数量的声卡,即音频设备提供所谓的环回输入设备,这将允许记录当前由声卡的主输出混合输出的内容。但是,即使提供此类设备,也不允许您将任何内容环回麦克风输入设备。麦克风输入设备仅从麦克风D / A转换器获取数据。这是H / W的深层次,你不能在你的关卡中混合任何东西。

    这就是说,让Skype通过标准设置向您的对话伙伴发送您的声音将非常非常困难(恕我直言,实际上是不可能的)。我唯一能想到的就是拥有一个具有环回功能的音频设备(或者只是将物理电缆连接到可能的监控线路输出到任何记录线),然后让Skype设置为使用这个环回设备作为输入。但是,Skype不会再从麦克风中取出,因此,您不会进行对话;)

    注意:在这里说“同时”播放时,我们讨论的是将两个声音的播放同步到实时感知(在10-20ms的范围内)。我们没有考虑样本级别的实际同步,以及在将声音发送到具有两个独立(自由运行)时钟的两个物理设备时发挥作用的相关时钟抖动和相移问题。因此,当应用程序要求在独立设备上生成相位信号时,需要时钟恢复机制,这可能由驱动程序或操作系统提供。

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

答案 1 :(得分:2)

有一种非常简单的方法可以同时在两个设备上输出音频:

  1. 对于Realtek设备,您可以使用音频混音器&#34;技巧&#34; (但这会给你一个延迟/回声);
  2. 对于其他一切(没有回声)你可以使用Voicemeeter(完全免费)。
  3. 我在此视频中解释了两种解决方案:https://youtu.be/lpvae_2WOSQ

    最好的问候