如何将音频从一种格式转换为Java中的wav或raw?

问题描述 投票:0回答:1

我试图弄清楚如何使用java.sound api将WAV文件转换为RAW / PCM格式。我在这里找到的许多帖子都是相反的,如何从RAW获得WAV。我是音频新手,希望有人能发布一个示例来说明如何执行此操作。

java audio wav pcm
1个回答
0
投票

最终,我找到了一种将音频从任何格式转换为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才能使这项工作正常进行,这有些令人费解。我找不到更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.