Java Sound API:捕获目标端口的声音输出

时间:2010-05-19 22:28:38

标签: java audio

我正在编写一个简单的软件,通过LAN传输音频。我已经实现了所有网络部分,但我磕磕绊绊的是使用Java Sound API。我已成功捕获麦克风的音频和线路输入,但我似乎无法从任何目标端口捕获,如扬声器。我的问题是,是否有可能从主目标端口捕获?以下是用于初始化该行的代码片段。

private boolean startCapture(){
    try{
        DataLine.Info info = new DataLine.Info( TargetDataLine.class, format);
        line = (TargetDataLine)AudioSystem.getLine(info);
        audioBuffer = new byte[bufferSize];
        line.open(format);
        line.start();
        return true;
    }catch(Exception e){
        System.out.println("Exception thrown when capturing audio:\n" + e);
        return false;
    }
}

运行这样的代码只会使用麦克风作为我的线路。 Here是关于我的音响系统的信息。最重要的可能是我正在运行Linux。

提前感谢您提供给我的任何和所有帮助。

3 个答案:

答案 0 :(得分:1)

网络声音的一个问题是,由于声卡时钟之间的差异,每端的计算机可能具有略微不同的采样率。电脑时钟各不相同如果发送计算机的运行速度比接收计算机慢,那么即使你有缓冲区,缓冲区也会慢慢清空。如果它运行得更快,那么你将慢慢获得过多的数据。 This person尝试了你正在做的事情并看到辍学。请注意,购买更昂贵的声卡将减少他的问题,但不能完全解决它,除非他做了类似锁定GPS时间信号的事情。您的典型临时用户不会这样做。

也许对于短暂的传输,你可以逃脱它。例如,如果您正在进行语音处理,并且在扬声器静音时停止发送,则可以在重新启动时同步缓冲区。我想知道它会对延迟做些什么。 “正确”的解决方案需要在接收端重新采样音频以处理采样率的微小差异。

对于频率的这种微小变化,您可能会离开最近的邻居 - 有效地每隔一段时间跳过或复制样本。我听说过的数字业余无线电软件在样本之间使用线性插值。您需要维护一个缩放因子并对其进行控制,以确保以新数据进入的速率清空缓冲区,但是控制循环不会因网络变幻莫测而烦恼而不会尝试突然发生大的变化

我不知道你是否考虑到了这一点。我见过人们试图这样做没有。我除了现在人们会使用现成的音频会议库来处理这种事情。如果您对如何操作感兴趣,数字业余无线电社区是一个值得关注的好地方。

答案 1 :(得分:1)

这是一种方式(不是编程方式)。

转到:控制面板\硬件和声音\ 点击声音图标。现在转到录音,右击 - >选择启用,断开连接的设备。您将找到“Stereo mix”图标。将其设为默认设备。

现在尝试录制声音。问题解决了。

答案 2 :(得分:0)

扬声器是SourceDataLine,而不是TargetDataLine。我不明白你怎么能从演讲者那里“捕捉”?