我试图弄清楚如何使用java.sound api将WAV文件转换为RAW / PCM格式。我在这里找到的许多帖子都是相反的,如何从RAW获得WAV。我是音频新手,希望有人能发布一个示例来说明如何执行此操作。
最终,我找到了一种将音频从任何格式转换为WAV格式,再从那里转换为RAW的方法。如果有人遇到此问题,我将在此处包括代码。我自己的情况特别是从WAV到RAW,所以我没有用其他格式测试过代码。
此方法将音频字节转换为给定格式,并产生一个字节[]结果作为WAV。
private static final AudioFormat EXAMPLE_FORMAT = new AudioFormat(
16_000,
16,
1,
true,
false
);
public byte[] formatAudioToWav(@NotNull final byte[] audioFileContent,
@NotNull final AudioFormat audioFormat) throws
IOException,
UnsupportedAudioFileException {
try (
final AudioInputStream originalAudioStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(audioFileContent));
final AudioInputStream formattedAudioStream = AudioSystem.getAudioInputStream(audioFormat, originalAudioStream);
final AudioInputStream lengthAddedAudioStream = new AudioInputStream(formattedAudioStream, audioFormat, audioFileContent.length);
final ByteArrayOutputStream convertedOutputStream = new ByteArrayOutputStream()
) {
AudioSystem.write(lengthAddedAudioStream, AudioFileFormat.Type.WAVE, convertedOutputStream);
return convertedOutputStream.toByteArray();
}
}
原来是WAV is a RAW file with some header information,因此很容易通过删除文件的前44个字节(即标头)来进行转换。
public byte[] formatWavToRaw(@NotNull final byte[] audioFileContent) {
return Arrays.copyOfRange(audioFileContent, 44, audioFileContent.length);
}
该代码的优点是可以正确关闭所有流,但是其缺点是可以直接使用byte [],因此不适用于大型文件。可以将其转换为纯流,但是请注意,如果您要使用该路线,则需要声音API的流之一的长度。另一个缺点是,即使代码清晰易读,也需要创建/包装3个AudioInputStream才能使这项工作正常进行,这有些令人费解。我找不到更好的解决方案。