![](/img/trans.png)
[英]How do I convert data read from a WAV file to an array of signed 16-bit raw audio data in java?
[英]How do I convert audio from one format to wav or raw in Java?
我想弄清楚如何使用java.sound api将 WAV 文件转换为 RAW/PCM 格式。 我需要将 WAV 文件从某些给定的音频格式转换为编码如下的 RAW 文件:
我在这里找到的许多帖子都是相反的,如何从 RAW 转到 WAV。 作为音频的新手,我希望有人可以发布一个示例来展示如何做到这一点。
据我所知,Java 声音 api 不会转换为 RAW 音频。 它确实转换为 WAV,这是带有 44 字节标头的 RAW 音频。 一旦你理解了这一点,你就可以将问题分解为两部分:
1. 将音频从任何格式转换为 WAV 格式。
下面的代码示例只测试了从WAV到WAV(不同的音频格式),但是理论上调用AudioSystem.getAudioInputStream(audioFormat, originalAudioStream);
如果有的话,应该找到合适的编解码器。
此方法将音频字节转换为给定的格式,并生成一个 byte[] 结果作为 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();
}
}
2. 从步骤 1 中创建的 WAV 文件中去除标题。
public byte[] formatWavToRaw(@NotNull final byte[] audioFileContent) {
return Arrays.copyOfRange(audioFileContent, 44, audioFileContent.length);
}
笔记
new AudioInputStream(formattedAudioStream, audioFormat, audioFileContent.length);
您需要其中一个流的长度new AudioInputStream(formattedAudioStream, audioFormat, audioFileContent.length);
.进一步阅读
您可以通过使用AudioInputStream
读取 WAV 文件中的 PCM 数据(以原始字节为单位),或者将数据存储在ByteBuffer
,从而轻松获取 PCM 数据(以原始字节为单位)。
Java 确实有一些内置的格式转换器。 我不确定您想要的特定转换是否受支持。 有关支持的格式转换的文档位于Audio Trail: Using Files and Format Converters
例如,如果您必须进行某种抽取,以便从具有 44.1kHz 采样率的 wav 变为 16kHz,我想使用线性插值会很好。
如果没有任何标头信息,则可以使用FileOutputStream
将生成的字节数组写入文件。 Java 教程:字节流
具有浮点精度的线性插值通常被认为足以保持音频保真度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.