用Java Sound API进行多声道USB录音?

我试图用Snow Leopard上的Java Sound录制/处理三个USB麦克风的audio(但是如果修复了问题,可以切换到Windows)。 问题是,当我尝试使用与USB麦克风相对应的调音台时,Java Sound告诉我该行不受支持。 具体来说,这是说…

可用的混音器:

Java声音audio引擎

USBMIC串行#041270067

内置input内置麦克风

Soundflower(2ch)

Soundflower(16ch)

线程“AWT-EventQueue-0”中的exceptionjava.lang.IllegalArgumentException:线路不支持:接口TargetDataLine支持格式PCM_SIGNED 96000.0 Hz,8位,立体声,2字节/帧,

当我要求它selectUSBMIC调音台时:

Mixer mixer = AudioSystem. getMixer(mixerInfo[1]); 

我已经尝试将audio格式与麦克风(16位,44100Hz,立体声)的确切规格进行匹配,并没有任何区别。

问题在这里出现:

  final TargetDataLine line = (TargetDataLine) mixer.getLine(info); 

这似乎是搅拌机和TargetDataLine不喜欢对方。 有什么办法让这两个“匹配”,相处?

我使用的麦克风无疑是有点奇怪的。 他们被制作成名为SingStar的卡拉OKvideo游戏。 麦克风本身具有标准的单声道线路input连接器,可插入一个小型集线器(两个集线器),将其转换为一个单独的USB连接器。 除了奇怪之外,他们似乎和Audacity一起工作的很好,因此多渠道logging显然是可能的,也许不是Java。

我也考虑过使用像Soundflower这样的程序来共享不同程序之间的audio。 不过,我不能确定这将工作,因为我不知道如何使USB麦克风input到Soundflower,然后将它们pipe入Java。 一个快速实验告诉我,我可以从麦克风录制Audacity中的audio,通过Soundflower将其导出,然后在我的Java程序中进行处理。 不过,我想要做的是在Java中实时发生。

有人熟悉这种问题吗?

我认为一个简单的方法就是使用Soundflower和Soundflowerbed。

我看不到如何将USB麦克风input到Soundflower,然后将其input到Java中。

听起来你已经安装了Soundflower。 Soundflowerbed与Soundflower在同一个磁盘映像中find,是一个菜单栏应用程序。 它允许您在没有内置控件的应用程序之间传送声音,以便select声音设备。 从磁盘映像安装它,然后单击它运行。

以下所有将使用我的Echo Audiofire 4,但原则上可以在任何audio设备上工作。

使用Soundflowerbed

打开Soundflower,在Soundflower(16ch)下打勾你想要使用的audio设备。 由于我是新用户,我无法发布图片,但是他们在下面链接。 如果我得到赏金,那么我将编辑post以包含图像内联。

1

从这里你可以使用Soundflower(16ch)作为Java声音的audioinput设备。

创build一个聚合audio设备

解决这个问题的另一种方法是,创build一个聚合设备。 打开应用程序>实用程序>audioMidi安装程序,然后单击加号以创build新的聚合设备。

2 勾选您想要聚合的设备。 你只需要你的USBMIC(因为我是一个新的SO用户,我只能发布两个图像每个答案,所以下面两个链接在这里)。

3

可能给你带来麻烦的关键部分是设备上的时钟。 如果您selectMac作为时钟源,那么可能会更稳定。 4

如果这仍然不起作用,那么您可以尝试将Mac内置audio添加到聚合设备,并通过右键单击要成为主设备的设备将其作为主时钟。

五

其他选项

最后,我还没有使用过,但是Pulse Audio(谷歌,我不能在这篇文章中插入更多的链接)可能是将audiostream混合在一起的一个可能的解决scheme。 它看起来相当重量级虽然。

根据我的研究,特别是像这样的线程,你使用的麦克风最有可能导致这个问题。 线程指出,在切换游戏时麦克风甚至是一个问题,所以我猜测切换平台也是一个问题。

我的build议是 – 如果你还没有尝试过 – 使用不同的麦克风! 大多数麦克风都有特殊的芯片控制器,可以将数据转换为与游戏系统兼容的数据。 因为你在电脑的操作系统上使用这个function,你可能会遇到一些非常奇怪的效果,你不会像Playstation或其他游戏系统上。

希望这有助于! 快乐的编码!

AudioFormat与TargetDataLine支持的格式不匹配。 我不知道这是不是一个错字,但抛出exception说,TargetDataLine支持8位audio,正下方,你说你正在使用一个16位的AudioFormat。 它还支持每帧最多2个字节,您尝试读取数据的速度和大小是多less? 对不起,如果这没有帮助,但我想我会指出,以防万一它被忽视。