【问题标题】:Why do I get only hear noise after changing the audio input in java?为什么在java中更改音频输入后我只会听到噪音?
【发布时间】:2014-11-10 03:09:11
【问题描述】:

我像这样初始化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

【问题讨论】:

  • 我想这已经被问过了。我正在寻找它。
  • 我在聊天中发布了为什么 drain() 对你不起作用。现在说得通了。我想我对你的信息流的问题部分正确。

标签: java audio microphone


【解决方案1】:

我确定问题出在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() 时不会发生这种情况。

【讨论】:

  • 我按照你的方法试过了。我创建了一个新线程并为每个新输入停止旧线程,但它没有改变任何东西。
  • 好的,到目前为止我知道改变输入设备不是问题。问题是我只能得到主输入设备的输入。
猜你喜欢
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2017-03-28
  • 2015-07-25
  • 1970-01-01
  • 2020-09-02
相关资源
最近更新 更多