Ich habe die mp3spi installiert, um das Lesen von mp3-Dateien in meinem Java-8-Projekt unter Verwendung der javax.sound * -Bibliotheken zu unterstützen. Mein Ziel ist es, mp3 in eine WAV-Datei zu schreiben. Das Ergebnis ist jedoch falsch. Hier ist der Code in seiner einfachsten Format:Konvertieren von mp3 zu wav in 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"));
}
Es gibt eine andere Art und Weise, wie hier beschrieben (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();
Diese eine Datei erzeugt, die aus einem komprimierten mp3 von 4-5 mb über 30 MBs funktioniert jedoch nicht als gültige WAV-Datei.
Die Methode, die für mich funktioniert, beinhaltet JLayer Converter-Klasse, aber ich möchte, wie ich sein könnte, weil ich einige andere Verarbeitung wie Ausschneiden von Teilen von Audio, Ändern der Lautstärke und Wiedergabegeschwindigkeit usw. machen möchte besser mit der nativen Bibliothek arbeiten.
Ich fordere die Existenz von mp3Data; Woher bekommst du das und was enthält es? In jedem Fall müssen Sie mit Bytes beginnen - ein Array von Bytes - wie in der Antwort - haben Sie dieses Array von Bytes? – gpasch
'Audioformat ConvertFormat = new Audioformat (AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), 16, sourceFormat.getChannels(), sourceFormat.getChannels() * 2, sourceFormat.getSampleRate(), false); 'Codiere diese Werte nicht hart. Verwenden Sie die gleichen Werte wie im Quellformat und es funktioniert wahrscheinlich wie angekündigt. –
gspasch kannst du die Existenz von mp3-Daten herausfordern, aber ich garantiere, dass es existiert! Ich werde meine Frage ändern, um diesen Teil des Codes zu enthalten – IcedDante