Я установил 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, однако, поскольку я хочу сделать некоторую другую обработку, например, вырезать части аудио, изменять громкость и скорость воспроизведения и т. Д., Я чувствую, что могу быть лучше работать с родной библиотекой.
Я вызываю существование mp3Data; где вы получаете это и от чего он содержится? В любом случае вам нужно начать с байтов - массива байтов - как в ответе - есть ли у вас этот массив байтов? – gpasch
'AudioFormat convertFormat = новый AudioFormat (AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), 16, sourceFormat.getChannels(), sourceFormat.getChannels() * 2, sourceFormat.getSampleRate(), ложь); 'Не переустанавливайте эти значения. Используйте те же значения, что и в исходном формате, и они, скорее всего, будут работать как рекламируемые. –
gspasch вы можете оспорить существование mp3-данных, но я гарантирую, что он существует! Я изменю свой вопрос, чтобы включить эту часть кода – IcedDante