使用音频流播放自定义音频格式

时间:2018-07-16 04:04:41

标签: java audio format

所以我开始从事视频游戏,我想创建自定义声音格式。

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库是不可能的?

1 个答案:

答案 0 :(得分:0)

如果要在默认音频解析器解析音频数据之前对其进行编辑,则可以按以下方式进行编辑

  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);

如果您的格式是真正的自定义格式,那么我建议您仅遵循以下一种标准化方法,并只需在您的字节数组中添加页眉或页脚即可。无需重做已完成的工作。或者,为简化起见,您可以添加一个单独的文件,该文件也要加载,其中包含希望与音频一起加载的不同数据。