2017-01-21 2 views
1

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.

+0

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

+1

'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. –

+0

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

Antwort

1

Nachdem Sie den MP3-Stream geöffnet haben, müssen Sie ihn normalerweise konvertieren, bevor Sie ihn in eine Datei schreiben.

so (ungetestet):

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

Ich ee Sie markiert dies als ungetestet und ich wollte sagen, dass ich es versucht habe und es nicht funktioniert. Das heißt nicht, dass es ohne einige Anpassungen nicht funktionieren kann, aber ab sofort konnte ich es nicht passieren – IcedDante

+2

es funktionierte für mich, ich musste nur ein paar Plugins hinzufügen, um .mp3 Dienste arbeiten zu lassen (mp3spi) – vict