我正在进行一项研究,其中两名参与者在讨论多个主题时会各自佩戴不同的麦克风。我需要能够用Java分析每个参与者的音频输入 - 独立捕获两个音频输入流。我无法将两个输入流组合起来进行分析。
有人知道我是否可以用Java做到这一点,以及如何做到这一点?
我遇到了this,其中指出“通常,一次只能打开一个输入端口,但也可以混合来自多个端口的音频的音频输入混音器。”
由于
修改1 : 捕获和分析必须实时完成。
编辑2 : 我使用的是Windows 7 64位操作系统。我的声卡只有一个麦克风端口。我有两个类似于this的USB音频适配器。如果我无法用Java实现这一目标,那么什么是一个很好的替代解决方案?建议使用USB库。我将对音频数据进行的分析是确定每个发言者的话语率(他们说话多少)。
的结论 的: 我可以通过Java中的线程同时读取两个TargetDataLines。我的两个USB音频适配器都可以在Java上看到。
答案 0 :(得分:0)
我自己还没有这样做,所以请将以下内容作为建议而非答案。 (我更多的是音乐合成和音频效果,用于实时播放,如游戏声音。)
正如您可能已在本教程中读到的那样,Java提供了一个名为AudioSystem的类,它提供对给定计算机上可用的行和端口的访问。如果您希望操作的计算机有两条麦克风线,那么我们完全有理由相信这两条线都会对Java可见。输入限制更多地取决于硬件(正在使用的声卡和它提供的麦克风线的数量)以及驱动程序和操作系统,而不是Java上的输入限制。您可能需要购买允许同时进行多次输入的特殊声卡。
另外,我知道在操作系统级别(特别是某些类型的Linux)可能存在限制,一次只允许一个输出行操作。这将限制Java可以看到的内容。但我还没有真正用我的Windows操作系统来探索这个问题。
为了从一行读取数据,通常使用TargetDataLine类。通常通过while循环从缓冲器块中的该行(例如,每次1024字节)读取数据。我过去曾经同时运行过多个TargetDataLines:数据源是各种Java软件合成源。假设每个TDL被分配给不同的输入线,则可以从该循环内读取每个TDL,然后将相应的数据传递给不同的分析器。 TargetDataLines是阻塞线 - 如果一条线没有准备好数据(通常处理速度比可以呈现的音频数据快得多) - 那么程序将阻塞直到数据存在。
Java具有很多实时DSP功能。我不知道您希望做的具体分析形式,但可能有独立来源的图书馆。