【问题标题】:Java: sun.sudio: Possible to not load audio file every time it is played?Java:sun.sudio:每次播放时都可能不加载音频文件?
【发布时间】:2014-12-25 16:48:04
【问题描述】:

有什么方法可以播放相同的音频文件(使用 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,只在 main 方法的开头加载一次我的文件:

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 时却没有任何声音。

我们将不胜感激任何解决此问题的帮助。

【问题讨论】:

    标签: java audio


    【解决方案1】:

    您可以将数据存储在 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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多