我像这样初始化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
答案 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()
时不会发生这种情况。