使用Java Sound API进行多通道USB录制?

时间:2010-11-21 19:06:57

标签: java usb record microphone javasound

我正在尝试使用Snow Leopard上的Java Sound录制/处理来自三个USB麦克风的一些音频(但如果修复了某些内容,则可以切换到Windows)。问题是,当我尝试使用与usb麦克风相对应的混音器时,Java Sound告诉我该行不受支持。具体来说,它说明了......

  

可用的混音器:

     

Java声音音频引擎

     

USBMIC Serial#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实现。

有人熟悉这类问题吗?

3 个答案:

答案 0 :(得分:4)

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

  

我无法看到如何将USB麦克风输入到Soundflower,然后将它们传输到Java中。

听起来你已经安装了Soundflower了。 Soundflowerbed与Soundflower位于同一磁盘映像中,是一个菜单栏应用程序。它允许您在没有内置控件的应用程序之间路由声音以选择声音设备。从磁盘映像安装它并单击它以运行。

以下所有内容都将使用我的Echo Audiofire 4,但原则上应该适用于任何音频设备。

使用Soundflowerbed

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

1

从这里开始,您将使用Soundflower(16ch)作为Java声音的音频输入设备。

创建聚合音频设备

如果不起作用,另一种解决方法是创建聚合设备。打开应用程序>公用事业> Audio Midi Setup并单击加号以创建新的聚合设备。

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

3

可能给您带来麻烦的关键部分是设备上的时钟。如果选择Mac作为时钟源,则可能更稳定。 4

如果仍然无效,那么您可以尝试将Mac内置音频添加到聚合设备,并通过右键单击要成为主设备的设备使其成为主时钟。

5

其他选项

最后,我之前没有使用过这个,但是Pulse Audio(谷歌它,我不能在这篇文章中插入更多链接)可能是将音频流混合在一起的可能解决方案。虽然它看起来很重量级。

答案 1 :(得分:2)

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

我的建议是 - 如果您还没有尝试过 - 请使用其他麦克风!我搞砸的大多数麦克风都有特殊的芯片控制器,可以将数据转换成与游戏系统兼容的数据。因为你在计算机的操作系统上使用它,你可能会得到一些非常奇怪的效果,你不会在Playstation等游戏系统上获得这些效果。

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

答案 2 :(得分:0)

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