Java:sun.sudio:每次播放时都可能无法加载音频文件?

时间:2014-12-25 16:48:05

标签: java audio

有没有办法播放相同的音频文件(使用sun.audio)而不必每次都加载Fileinputstream?这就是我现在正在尝试做的事情:

public static void nomnom() throws Exception
    {

        FileInputStream in = new FileInputStream ("nomnom.au");
        AudioStream as = new AudioStream (in);
        AudioPlayer.player.start (as);
        ContinuousAudioDataStream loop = null;
    }

尽管" nomnom.au"只有几秒钟,当我重复这个方法(播放声音)大约30次时,我很快得到一个OutofMemoryError。我认为这是因为我每次需要播放时都会加载音频文件。

我尝试在课程的最开始声明FileInputStream和AudioStream,只在主方法的开头加载我的文件:

public class Snake
{
static InputStream in; 
static AudioStream as; 
.
.
.
    public static void nomnomload () throws Exception
    {
    in = new FileInputStream ("nomnom.au"); 
    as = new AudioStream (in)
    }

    public static void nomnomplay() throws Exception
    {
    AudioPlayer.player.start (as);
    ContinuousAudioDataStream loop = null;
    }
}

我希望只在游戏开始时调用nomnomload方法。但是,当我尝试播放音频时,我只是第一次听到声音,而后来尝试运行nomnomplay则没有任何内容。

非常感谢您解决此问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以将数据存储在byte []缓冲区中。

例如,您可以修改load()功能

static byte[] buffer;
public static void nomnomload() throws Exception {
    if (buffer == null) {
        FileInputStream fis = new FileInputStream("nomnom.au");
        buffer = new byte[fis.available()];
        fis.read(buffer);
        fis.close();
    }
    in = new ByteArrayInputStream(buffer);
    as = new AudioStream(in);
}

然后你基本上将数据存储在一个已定义的数组中(你不会重读文件,只是一个数组)...