Konvertieren Sie audio-stream in WAV byte-array in Java ohne temp-Datei
Gegeben InputStream
genannt in
enthält Audiodaten in einem komprimierten format (wie MP3 oder OGG), ich möchte erstellen Sie eine byte
array mit einer WAV Konvertierung der Eingabedaten. Leider, wenn Sie versuchen, dies zu tun, JavaSound Hände Sie die folgende Fehlermeldung:
java.io.IOException: stream length not specified
Habe ich es geschafft es zum laufen zu bringen, indem Sie die wav-in eine temporäre Datei, dann Lesen Sie es wieder an, wie unten gezeigt:
AudioInputStream source = AudioSystem.getAudioInputStream(new BufferedInputStream(in, 1024));
AudioInputStream pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source);
AudioInputStream ulaw = AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, pcm);
File tempFile = File.createTempFile("wav", "tmp");
AudioSystem.write(ulaw, AudioFileFormat.Type.WAVE, tempFile);
//The fileToByteArray() method reads the file
//into a byte array; omitted for brevity
byte[] bytes = fileToByteArray(tempFile);
tempFile.delete();
return bytes;
Dies ist natürlich weniger wünschenswert. Gibt es einen besseren Weg?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass die meisten AudioFileWriters müssen wissen, die Größe der Datei im Voraus, wenn das schreiben an einen Ausgabestrom. Weil Sie nicht bieten kann dies, es schlägt immer fehl. Leider ist der Standard-Java-sound-API-Implementierung hat keine alternativen.
Aber können Sie versuchen, mit der AudioOutputStream Architektur aus dem Tritonus-plugins (Tritonus ist ein open-source-Implementierung der Java-sound-API): http://tritonus.org/plugins.html
Ich merke, dieser wurde aufgefordert, vor sehr langer Zeit. Bei jeder neuen person (mit Java 7 und höher) diesen thread gefunden, beachten Sie, es gibt eine bessere neue Art und Weise, es zu tun über Dateien.readAllBytes API. Siehe:
Wie zu konvertieren .wav-Datei in byte-array?
Zu spät, ich weiß, aber ich war brauchte das, also das ist meine zwei Cent zu dem Thema.
Das Problem ist einfach zu lösen, wenn Sie bei der Vorbereitung der Klasse, das richtige header für Sie. In meinem Beispiel Beispiel, wie man Lesen audio-Eingang in wav-Puffer Daten geht in einige Puffer, danach erstelle ich Kopf-und wav-Datei in den Puffer. Keine Notwendigkeit, in zusätzliche Bibliotheken. Kopieren Sie einfach den code aus meinem Beispiel.
Beispiel, wie die Klasse erzeugt korrekte header im Puffer-array:
Und Klasse NewWaveWriter finden Sie unter meinem link.
Dies ist sehr einfach...
Den .tmp-Datei ist eine RAW-Datei, das Ergebnis ist eine WAV-Datei mit header.