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



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

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库不可能这样做?

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

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

如果你的格式真的是自定义的,我建议你遵循这些标准化的方法之一,只需在字节数组中添加一个页眉或页脚。没有必要重新制作已经完成的内容。或者,为了简化操作,您可以添加一个单独的文件,也可以加载该文件,其中包含您希望随音频加载的不同数据。

最新更新