2017-01-21 7 views
1

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

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 to wav conversion in 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, однако, поскольку я хочу сделать некоторую другую обработку, например, вырезать части аудио, изменять громкость и скорость воспроизведения и т. Д., Я чувствую, что могу быть лучше работать с родной библиотекой.

+0

Я вызываю существование mp3Data; где вы получаете это и от чего он содержится? В любом случае вам нужно начать с байтов - массива байтов - как в ответе - есть ли у вас этот массив байтов? – gpasch

+1

'AudioFormat convertFormat = новый AudioFormat (AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), 16, sourceFormat.getChannels(), sourceFormat.getChannels() * 2, sourceFormat.getSampleRate(), ложь); 'Не переустанавливайте эти значения. Используйте те же значения, что и в исходном формате, и они, скорее всего, будут работать как рекламируемые. –

+0

gspasch вы можете оспорить существование mp3-данных, но я гарантирую, что он существует! Я изменю свой вопрос, чтобы включить эту часть кода – IcedDante

ответ

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")); 
} 
+0

Я вас заметил, что это непроверено, и я хотел сказать, что я попробовал, и он не работает. Это не означает, что он не может работать без каких-либо корректировок, но на данный момент я не смог это сделать – IcedDante

+2

Это сработало для меня, мне просто пришлось добавить некоторые pluggin для работы .mp3-сервисов (mp3spi) – vict