Конвертировать mp3 в wav на Java

Я установил mp3spi для поддержки чтения mp3-файлов в своем проекте Java 8 с использованием библиотек javax.sound*. Моя цель сейчас - записать mp3 в файл wav. Однако результат неверен. Вот код в его простейшем формате:

public static void mp3ToWav(InputStream mp3Data) throws UnsupportedAudioFileException, IOException {
    AudioInputStream mp3Stream = AudioSystem.getAudioInputStream(mp3Data);
    AudioFormat format = mp3Stream.getFormat();
    AudioFormat convertFormat = new AudioSystem.write(mp3Stream, Type.WAVE, new File("C:\\temp\\out.wav"));
}

Здесь есть еще один способ ( конвертация mp3 в wav в java):

File mp3 = new File("C:\\music\\greatest-songs-of-all-time\\RebeccaBlack-Friday.mp3");
if(!mp3.exists()) {
    throw new FileNotFoundException("couldn't find mp3");
}
FileInputStream fis = new FileInputStream(mp3);
BufferedInputStream bis = new BufferedInputStream(fis);

AudioInputStream mp3Stream = AudioSystem.getAudioInputStream(bis);
AudioFormat sourceFormat = mp3Stream.getFormat();
AudioFormat convertFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
        sourceFormat.getSampleRate(), 16, 
        sourceFormat.getChannels(), 
        sourceFormat.getChannels() * 2,
        sourceFormat.getSampleRate(),
        false);

try (final AudioInputStream convert1AIS = AudioSystem.getAudioInputStream(mp3Stream)) {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final AudioInputStream convert2AIS = AudioSystem.getAudioInputStream(convertFormat, convert1AIS);
    System.out.println("Length is: " + mp3Stream.getFrameLength() + " div by " + mp3Stream.getFormat().getFrameRate());
    byte [] buffer = new byte[8192];
    int iteration = 0;
    while(true){
        int readCount = convert2AIS.read(buffer, 0, buffer.length);
        if(readCount == -1){
            break;
        }
        baos.write(buffer, 0, readCount);
        iteration++;
    }

    System.out.println("completed with iteration: " + iteration);

    FileOutputStream fw = new FileOutputStream("C:\\temp\\out-2.wav");
    fw.write(baos.toByteArray());
    fw.close();
}

bis.close();
fis.close();

Это создает файл размером более 30 МБ из сжатого mp3 размером 4-5 МБ, однако он не работает как действительный файл WAV.

Метод, который работает для меня, включает использование класса JLayer Converter, однако, поскольку я хочу выполнить какую-то другую обработку, например вырезать фрагменты звука, изменить громкость и скорость воспроизведения и т. Д., Я чувствую, что мне может быть лучше работать с родная библиотека.

1 ответ

После того, как вы открыли поток mp3, вам обычно нужно конвертировать его перед записью в файл.

Как это (не проверено):

public static void mp3ToWav(File mp3Data) throws UnsupportedAudioFileException, IOException {
    // open stream
    AudioInputStream mp3Stream = AudioSystem.getAudioInputStream(mp3Data);
    AudioFormat sourceFormat = mp3Stream.getFormat();
    // create audio format object for the desired stream/audio format
    // this is *not* the same as the file format (wav)
    AudioFormat convertFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
        sourceFormat.getSampleRate(), 16, 
        sourceFormat.getChannels(), 
        sourceFormat.getChannels() * 2,
        sourceFormat.getSampleRate(),
        false);
    // create stream that delivers the desired format
    AudioInputStream converted = AudioSystem.getAudioInputStream(convertFormat, mp3Stream);
    // write stream into a file with file format wav
    AudioSystem.write(converted, Type.WAVE, new File("C:\\temp\\out.wav"));
}
Другие вопросы по тегам