我试图编写一个简单的音板,但是遇到一个问题,当我使用耳机作为输出时,没有声音播放。
我创建了一个简单的测试类,以查看它是否与我自己的代码有关。
它的作用是读取默认的Windows输入设备并将其音频写入默认的Windows输出设备。
我已将其使用的音频设备(第13行)的索引更改为我拥有的每个音频设备。除了我的耳机(索引1)外,它可以与其中的每一个配合使用。
现在,我不确定我是否以错误的方式使用了api,或者是否是外部问题(例如驱动程序或其他问题)。
(如果很重要,我使用的耳机是Logitech g430)
代码:
import javax.sound.sampled.*;
import java.util.ArrayList;
public class Test
{
public static void main(String[] args) throws LineUnavailableException
{
//Mic
Mixer micMixer = AudioSystem.getMixer(getInputs().get(0)); //Get windows default mic
TargetDataLine micLine = (TargetDataLine) micMixer.getLine(micMixer.getTargetLineInfo()[0]);
//Speaker
Mixer speakerMixer = AudioSystem.getMixer(getSpeakers().get(0)); //Get windows default speaker
SourceDataLine speakerLine = (SourceDataLine) speakerMixer.getLine(speakerMixer.getSourceLineInfo()[0]);
//Open/Start lines
micLine.open();
speakerLine.open();
micLine.start();
speakerLine.start();
byte[] buffer = new byte[1024];
for(;;)
{
micLine.read(buffer, 0, buffer.length);
speakerLine.write(buffer, 0, buffer.length);
}
}
//Returns a list of Mixer.Info objects representating speakers/output devices
private static ArrayList<Mixer.Info> getSpeakers() throws LineUnavailableException
{
ArrayList<Mixer.Info> speakers = new ArrayList<>();
Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
for (Mixer.Info info: mixerInfos)
{
Mixer m = AudioSystem.getMixer(info);
m.open();
Line.Info[] lineInfos = m.getSourceLineInfo();
if (lineInfos.length != 0)
speakers.add(info);
}
return speakers;
}
//Returns a list of Mixer.Info objects representating microphones/input devices
private static ArrayList<Mixer.Info> getInputs()
{
ArrayList<Mixer.Info> mics = new ArrayList<>();
Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
for (Mixer.Info info: mixerInfos)
{
Mixer m = AudioSystem.getMixer(info);
Line.Info[] lineInfos = m.getTargetLineInfo();
if (lineInfos.length != 0)
mics.add(info);
}
return mics;
}
}