写入某个javax.sound.sampled.SourceDataLine时没有声音播放

时间:2018-06-24 14:51:07

标签: java audio-player

我试图编写一个简单的音板,但是遇到一个问题,当我使用耳机作为输出时,没有声音播放。

我创建了一个简单的测试类,以查看它是否与我自己的代码有关。

它的作用是读取默认的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;
    }
}

0 个答案:

没有答案