Java长度无限AudioInputStream



我有一堆代码,当运行时,将产生程序声音。不幸的是,它只持续几秒钟。理想情况下,它会一直运行,直到我让它停下来。我说的不是循环,生成它的算法目前提供了2^64个样本,所以在可预见的未来,它不会耗尽。AudioInputStream的构造函数接受第三个输入,理想情况下我可以直接删除它。我可以提供一个很大的数字,但这似乎是错误的方法。

我考虑过使用SourceDataLine,但理想情况下,算法将按需调用,而不是提前运行并写入路径。想法吗?

看来我已经回答了我自己的问题。

经过进一步的研究,使用SourceDataLine是可行的方法,因为当你给它足够的工作时,它会阻塞。

为缺少适当的Javadoc而道歉。

class SoundPlayer
{
    // plays an InputStream for a given number of samples, length
    public static void play(InputStream stream, float sampleRate, int sampleSize, int length) throws LineUnavailableException
    {
        // you can specify whatever format you want...I just don't need much flexibility here
        AudioFormat format = new AudioFormat(sampleRate, sampleSize, 1, false, true);
        AudioInputStream audioStream = new AudioInputStream(stream, format, length);
        Clip clip = AudioSystem.getClip();
        clip.open(audioStream);
        clip.start();
    }
    public static void play(InputStream stream, float sampleRate, int sampleSize) throws LineUnavailableException
    {
        AudioFormat format = new AudioFormat(sampleRate, sampleSize, 1, false, true);
        SourceDataLine line = AudioSystem.getSourceDataLine(format);
        line.open(format);
        line.start();
        // if you wanted to block, you could just run the loop in here
        SoundThread soundThread = new SoundThread(stream, line);
        soundThread.start();
    }
    private static class SoundThread extends Thread
    {
        private static final int buffersize = 1024;
        private InputStream stream;
        private SourceDataLine line;
        SoundThread(InputStream stream, SourceDataLine line)
        {
            this.stream = stream;
            this.line = line;
        }
        public void run()
        {
            byte[] b = new byte[buffersize];
            // you could, of course, have a way of stopping this...
            for (;;)
            {
                stream.read(b);
                line.write(b, 0, buffersize);
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新