jjzjj

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

coder 2024-06-17 原文

好,第一个问题。我正在尝试编写一个虚拟的音板,该音板将一次输出到多个设备。我希望使用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/

    有关windows - 同时将声音输出到多个音频设备的更多相关文章

    1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    2. ruby-on-rails - Rails 3 中的多个路由文件 - 2

      Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

    3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

      我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

    4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

      为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

    6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

      我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

    7. ruby - 多个属性的 update_column 方法 - 2

      我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

    8. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

      我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

    9. ruby - 如何进行排列以有效地定制输出 - 2

      这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

    10. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

      这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

    随机推荐