来自插槽的“无尽”音频输入流
我在从Socket创建AudioInputStream时遇到问题。以下是重要部分:
public class SoundStream extends Thread {
    private int port;
    private String IP;
    private Socket socket;
    private SoundObject soundObject;
    private OpenAL openAL;
    private Source source;
    private boolean run = true;
    public SoundStream(int port, String IP, SoundObject soundObject) {
        this.soundObject = soundObject;
        this.port = port;
        this.IP = IP;
    }
    public void run() {
        try {
            this.socket = new Socket(this.IP, this.port);
            this.openAL = new OpenAL();
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.mainCycleMethod();
    }
    private void mainCycleMethod() {
        while (run) {
            this.soundObject.blockAndWait();
            switch (this.soundObject.getAndResetEvent()) {
                case 0:
                    this.run = false;
                    this.close();
                    break;
                case 1:
                    this.setPitch();
                    break;
                case 2:
                    this.closeSource();
                    this.play();
                    break;
                case 3:
                    this.pause(true);
                    break;
                case 4:
                    this.pause(false);
                    break;
            }
        }
    }
    private BufferedInputStream getInputStream() throws Exception {
        return new BufferedInputStream(socket.getInputStream());
    }
    private void setPitch() {
        if(this.source != null) {
            try {
                this.source.setPitch(this.soundObject.getPitch());
            } catch (ALException e) {
                e.printStackTrace();
            }
        }
    }
    private void play() {
        try {
            AudioInputStream audioInputStream = new AudioInputStream(this.getInputStream(), this.soundObject.getAudioFormat(), AudioSystem.NOT_SPECIFIED);
//            AudioInputStream audioInputStream_tmp = AudioSystem.getAudioInputStream(this.getInputStream());
//            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(this.soundObject.getAudioFormat(), audioInputStream_tmp);
            this.source = openAL.createSource(audioInputStream);
            this.source.setGain(1f);
            this.source.play();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    private void close() {
        this.closeSource();
        this.openAL.close();
        try {
            this.socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private void closeSource() {
        if(this.source!=null) {
            this.source.close();
        }
    }
    private void pause(boolean pause) {
        if(this.source != null) {
            try {
                if (pause) {
                    this.source.pause();
                } else {
                    this.source.play();
                }
            } catch (ALException ex) {
                ex.printStackTrace();
            }
        }
    }
}
public class SoundObject extends AbstractEventObject {
    public AudioFormat getAudioFormat() {
        boolean signed = false;
        //true,false
        boolean bigEndian = false;
        //true,false
        return new AudioFormat(this.frequency, this.bits, this.channels, signed, bigEndian);
    }
.
.
.
.
}
此代码在以下行抛出不受支持的AudioFileException:
AudioInputStream audioInputStream_tmp = AudioSystem.getAudioInputStream(this.getInputStream());
但是,当我使用此代码时:
AudioInputStream audioInputStream = new AudioInputStream(this.getInputStream(), this.soundObject.getAudioFormat(), 100000);
它播放声音,但只有在将这100000个样本帧加载到音频输入流之后。在播放所有100000帧后,它完成了。
我想如果我可以在第一次AudioInputStream初始化期间直接将AudioFormat作为参数传递,我会解决这个问题,但这似乎是不可能的。我正在从服务器接收音频格式规范。
我认为一个可能的解决方案是创建一条数据线,我可以将其作为参数传递给AudioInputStream构造函数。但是,我不确定如何将数据从套接字直接获取到数据线。我知道一个使用无限循环的解决方案,它读取数据并将其写入数据线。但这似乎是浪费。有没有更直接的方法?
我希望使用java-openAL库可以解决,因为我需要改变速度,我希望我不必自己做。
谢谢