使用 Java Sound API 进行多通道 USB 录音?
Posted
技术标签:
【中文标题】使用 Java Sound API 进行多通道 USB 录音?【英文标题】:Multichannel USB recording with Java Sound API? 【发布时间】:2011-05-13 11:41:43 【问题描述】:我正在尝试使用 Snow Leopard 上的 Java Sound 录制/处理来自三个 USB 麦克风的一些音频(但如果可以解决问题,可以切换到 Windows)。问题是,当我尝试使用与 USB 麦克风对应的混音器时,Java Sound 告诉我该线路不受支持。具体来说,它是这样说的……
可用的混音器:
Java 声音音频引擎
USBMIC 序列号#041270067
内置输入内置麦克风
Soundflower (2ch)
Soundflower (16ch)
线程“AWT-EventQueue-0”中的异常 java.lang.IllegalArgumentException: 不支持的线路:接口 TargetDataLine 支持格式 PCM_SIGNED 96000.0 Hz,8 位,立体声, 2字节/帧,
...当我要求它选择 USBMIC 混音器时:
Mixer mixer = Audiosystem.
getMixer(mixerInfo[1]);
我已尝试将音频格式与麦克风的确切规格(16 位、44100Hz、立体声)匹配,但没有任何区别。
问题出现在这里:
final TargetDataLine line = (TargetDataLine)
mixer.getLine(info);
看起来混音器和 TargetDataLine 彼此不喜欢。有没有办法让这两者“匹配”并相处融洽?
无可否认,我使用的麦克风有点奇怪。它们被用于名为 SingStar 的卡拉 OK 视频游戏中。麦克风本身有标准的单声道输入连接器,可插入一个小集线器(两个到一个集线器),将它们转换成一个公的 USB 连接器。不过,除了奇怪之外,它们似乎与 Audacity 作为单独的通道一起工作得非常好,因此使用它们进行多通道录制显然是可能的,只是在 Java 中可能不行。
我还考虑过使用像 Soundflower 这样的程序来在不同程序之间共享音频。但是,我不确定这是否可行,因为我看不到如何将 USB 麦克风输入到 Soundflower,然后将它们通过管道传输到 Java 中。一个快速的实验告诉我,我可以在 Audacity 中从麦克风录制音频,通过 Soundflower 将其输出,然后在我的 Java 程序中进行处理。不过,我想做的是让这一切都在 Java 中实时发生。
有人熟悉这类问题吗?
【问题讨论】:
嗯...Audacity 不能一次只从一台设备录制吗?那是你做的吗? 我不会指望 Java 声音 API 在更复杂的情况下是正确的。您能否使用第三方 Java 程序来验证问题不在 JRE 级别?或者也许使用更新的 JRE?在 Windows 上,USB 音频设备驱动程序也有点乏力。 我已经有好几年没有弄乱声音了。但这可能会有所帮助:每个声音设备都有自己的内部时钟。也有例外,您会在声卡/设备上看到它们作为时钟输入。以自己的时钟运行的设备将不同步。它们可能在记录开始时是同步的,但由于采样的速率略有不同,因此会有漂移。录音时间越长,漂移就越明显。 【参考方案1】:我认为一个简单的方法是使用 Soundflower 和 Soundflowerbed。
我不知道如何将 USB 麦克风输入到 Soundflower,然后将它们通过管道传输到 Java。
听起来您已经安装了 Soundflower。 Soundflowerbed 与 Soundflower 位于同一磁盘映像中,是一个菜单栏应用程序。它允许您在没有内置控件用于选择声音设备的应用程序之间路由声音。从磁盘映像安装它并单击它运行。
以下所有内容都将使用我的 Echo Audiofire 4,但原则上应该适用于任何音频设备。
使用 Soundflowerbed
打开 Soundflower 并在 Soundflower (16ch) 下勾选您要使用的音频设备。由于我是新用户,我无法发布图片,但它们在下面链接。如果我得到赏金,那么我将编辑帖子以包含内联图像。
从这里您将使用 Soundflower (16ch) 作为 Java 声音中的音频输入设备。
创建聚合音频设备
如果这不起作用,另一种解决方法是创建一个聚合设备。打开 Applications > Utilities > Audio Midi Setup 并单击加号以创建新的聚合设备。
勾选您要聚合的设备。你只想要你的 USBMIC(因为我是一个新的 SO 用户,我每个答案只能发布两张图片,所以接下来的两张在这里链接)。
可能给您带来麻烦的关键部分是设备上的时钟。如果您选择 Mac 作为时钟源,那可能会更稳定。
如果这仍然不起作用,那么您可以尝试将 Mac 内置音频添加到聚合设备,并通过右键单击要成为主设备的设备使其成为主时钟。
其他选项
最后,我以前没有使用过这个,但 Pulse Audio(谷歌它,我不能在这篇文章中插入更多链接)可能是一个可能的解决方案,可以将你的音频流混合在一起。不过它看起来很重。
【讨论】:
感谢丹尼尔坎普顿的努力。问题是 2010 年提出的问题,因此提问者可能无法验证您的答案。但是,如果您可以确认(并且可能谈论甚至给出 Java 示例)录音设备现在可用于 Java 音频 API,那么我会给您赏金。 (如果提问者选择了您当前的答案,那么赏金显然是您的) 不幸的是,我对 Java 音频 API 一点也不熟悉,所以我无法详细说明它是如何工作的。我查看了 Java 音频 API,但看不到如何更改音频输入源。如果我有他选择他的 USBMIC 的原始询问者代码,那么我可能会从中工作以使其工作。【参考方案2】:根据我的研究,尤其是像this 这样的线程,您使用的麦克风很可能是导致问题的原因。帖子说切换游戏时麦克风甚至是问题,所以我猜测切换平台时也会出现问题。
我的建议是 - 如果您还没有尝试过 - 使用不同的麦克风!我弄乱过的大多数麦克风都有特殊的芯片控制器,可以将数据转换为与游戏系统兼容的数据。由于您在计算机的操作系统上使用它,您可能会得到一些非常奇怪的效果,而这些效果在 Playstation 或其他游戏系统上是不会得到的。
希望这会有所帮助!编码愉快!
【讨论】:
【参考方案3】:AudioFormat 与 TargetDataLine 支持的格式不匹配。我不知道这是否是一个错字,但抛出的异常说 TargetDataLine 支持 8 位音频,并且在您说您正在使用 16 位音频格式的下方。它还支持每帧最多 2 个字节,您尝试读取数据的速度和大小是多少?抱歉,如果这没有帮助,但我想我会指出这一点,以防它被忽略。
【讨论】:
以上是关于使用 Java Sound API 进行多通道 USB 录音?的主要内容,如果未能解决你的问题,请参考以下文章
普通话识别,mp3格式转wav, 采样率转换48000转16000,多通道转单通道,运用百度API,短音频,python