2008-10-13 12 views
7

Angesichts einer InputStream namens in, die Audiodaten in einem komprimierten Format (wie MP3 oder OGG) enthält, möchte ich ein byte-Array mit einer WAV-Konvertierung des Eingangs erstellen Daten. wenn Sie Leider versuchen, dies zu tun, die Hände Javasound Sie den folgenden Fehler:Konvertieren Audiostream in WAV-Byte-Array in Java ohne temporäre Datei

java.io.IOException: stream length not specified 

ich es geschafft, es zu bekommen, indem er die wav in eine temporäre Datei zu arbeiten, dann ist es wieder beim Lesen, wie unten dargestellt:

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 offensichtlich weniger wünschenswert. Gibt es einen besseren Weg?

Antwort

6

Das Problem ist, dass die meisten AudioFileWriter die Dateigröße im Voraus kennen müssen, wenn sie in einen OutputStream schreiben. Da Sie dies nicht bereitstellen können, schlägt es immer fehl. Leider hat die Standard-Java-Sound-API-Implementierung keine Alternativen.

Aber Sie können mit Hilfe der AudioOutputStream Architektur aus dem Tritonus-Plugins versuchen (Tritonus ist eine Open-Source-Implementierung der Java-Sound-API): http://tritonus.org/plugins.html

+1

Ich muss das versuchen. Es könnte ein bisschen dauern, bevor ich es versuchen kann, daher kann ich die Antwort im Moment nicht akzeptieren. Ich werde es jedoch aufwerten. –

-2

Dies ist sehr einfach ...

File f = new File(exportFileName+".tmp"); 
File f2 = new File(exportFileName); 
long l = f.length(); 
FileInputStream fi = new FileInputStream(f); 
AudioInputStream ai = new AudioInputStream(fi,mainFormat,l/4); 
AudioSystem.write(ai, Type.WAVE, f2); 
fi.close(); 
f.delete(); 

Die .tmp-Datei ist eine RAW-Audiodatei, das Ergebnis ist eine WAV-Datei mit Header.

+1

Die Frage fragt, ob es * ohne * eine temporäre Datei möglich ist. –

1

Ich bemerke, dass dieser vor sehr langer Zeit gefragt wurde. Falls eine neue Person (die Java 7 und höher verwendet) diesen Thread gefunden hat, beachten Sie, dass es einen besseren neuen Weg gibt, dies über die Files.readAllBytes API zu tun. Siehe: How to convert .wav file into byte array?

1

Zu spät, ich weiß, aber ich wurde benötigt, also das ist meine zwei Cent zum Thema.

-1

Das Problem ist einfach zu lösen, wenn Sie Klasse vorbereiten, die richtige Header für Sie erstellen wird. In meinem Beispiel gehen Example how to read audio input in wav buffer Daten in einem Puffer, danach erzeuge ich Header und habe wav Datei im Puffer. Keine Notwendigkeit in zusätzlichen Bibliotheken. Kopieren Sie einfach den Code aus meinem Beispiel.

Beispiel, wie Klasse zu verwenden, die richtigen Header im Puffer-Array erstellt:

public void run() {  
    try {  
     writer = new NewWaveWriter(44100); 

     byte[]buffer = new byte[256]; 
     int res = 0; 
     while((res = m_audioInputStream.read(buffer)) > 0) { 
      writer.write(buffer, 0, res); 
     } 
    } catch (IOException e) { 
     System.out.println("Error: " + e.getMessage()); 
    }  
}  

public byte[]getResult() throws IOException { 
    return writer.getByteBuffer(); 
} 

Und Klasse NewWaveWriter können Sie unter meinem Link.