【问题标题】:Playing custom audio formats with audio stream使用音频流播放自定义音频格式
【发布时间】:2018-07-16 04:04:41
【问题描述】:

所以我开始制作视频游戏,我想创建一种自定义声音格式。

Path file = Paths.get("C:", "Users", "Mariobro85", "Desktop", "test.wav");

public void playFile() throws InterruptedException{
    try{
        File f = new File(file.toString());
        URL url = f.toURI().toURL();

        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);

        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);

        clip.start();

        Thread.sleep(15000);
    }
    catch(UnsupportedAudioFileException uafE){
        System.out.println("ERROR: Audio data of the file " + file + " is not in wave format.");
    }
    catch(IOException ioE){
        System.out.println("ERROR: Audio data of the file " + file + " is corrupted.");
    }
    catch(LineUnavailableException luE){
        System.out.println(luE);
    }
}

但这只能播放标准的 .wav 文件。 我也使用自定义格式的 wav,但问题是我的文件中的音频数据从 0x60 而不是 0x0 开始,并且还存储了循环、音量等信息。因此,它总是抛出 UnsupportedAudioFileException。

有什么方法可以告诉 AudioStream 跳转到一个特定的地址,还是标准的 java 库无法做到这一点?

【问题讨论】:

    标签: java audio format


    【解决方案1】:

    如果要在默认音频解析器解析之前编辑音频数据,可以如下编辑

      File file=new File("path/to/file");
        byte[] bytes= Files.readAllBytes(file.toPath());
        //edit or trim bytes as you wish.
        ByteArrayInputStream inputStream=new ByteArrayInputStream(bytes);//you can even give an offset in this constructor
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputStream);
    
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
    
        clip.start();
        Thread.sleep(xAmount);
    

    如果您的格式是真正自定义的,我建议您只遵循这些标准化方法之一,并简单地将页眉或页脚添加到您的字节数组中。无需重新制作已经完成的内容。或者,为了使事情更简单,您可以添加一个您也加载的单独文件,其中包含您希望与音频一起加载的不同数据。

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 2015-01-17
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多