为什么在更改java中的音频输入后才能听到噪音?

时间:2014-11-09 12:41:35

标签: java audio microphone

我像这样初始化AudioInputStream

dataLineInfo = new DataLine.Info(TargetDataLine.class, getAudioFormat()) ;
targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
targetDataLine.open(getAudioFormat());
targetDataLine.start();

工作正常,我可以听到麦克风的音频输入。

如果我尝试将音频输入更改为其他设备,我只会听到噪音。我试着解决这个问题一个星期了,我真的不知道为什么我听不到其他音频输入设备......我会为任何帮助感到自豪!

Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();

for (int cnt = 0; cnt < mixerInfo.length; cnt++) {
    Mixer currentMixer = AudioSystem.getMixer(mixerInfo[cnt]);

    if (mixerInfo[cnt].getName() == combo1.getSelectedItem().toString()) {
        System.out.println("Gewählter Input gefunden");

        if (targetDataLine.isRunning()) {
            targetDataLine.stop();
        }

        targetDataLine.flush();

        if (targetDataLine.isOpen()) {
            targetDataLine.close();
        }

        dataLineInfo = new DataLine.Info(TargetDataLine.class, getAudioFormat());
        try {
            targetDataLine = (TargetDataLine) currentMixer.getLine(dataLineInfo);
            targetDataLine.open(getAudioFormat());
            targetDataLine.start();

        } catch(LineUnavailableException e1) {
            e1.printStackTrace();
        }
    }
}

有关完整代码,请转到github

1 个答案:

答案 0 :(得分:0)

我确定问题出在actionPerformed()方法中:

dataLineInfo = new DataLine.Info( TargetDataLine.class , getAudioFormat() ) ;
try {
    targetDataLine = (TargetDataLine) currentMixer.getLine(dataLineInfo) ;
    targetDataLine.open(getAudioFormat());
    targetDataLine.start();
    // TODO: You must read what's in the buffer here

} catch (LineUnavailableException e1) {
    e1.printStackTrace();
}

首次创建Microphone2对象时,将调用此部分:

public void run(){

    while(continueLoop){

        n = targetDataLine.read(tempBuffer, 0, tempBuffer.length);

        updateMeter();

        try {
            Object_Output_Stream.writeObject(tempBuffer);
            Object_Output_Stream.reset();

        } catch (IOException ex) {
            ex.printStackTrace();
            continueLoop = false;
        }
    }
}

如您所见,读取缓冲区并使用缓冲区中的内容填充输出流。调用actionPerformed()时不会发生这种情况。