2008-10-13 29 views
7

göz önüne alındığında, bir InputStream (MP3 veya OGG gibi) bir sıkıştırılmış biçimde ses verilerini içerir in, bir giriş WAV dönüşümünü ihtiva eden bir byte dizi oluşturmak isteyen denilen veri. aşağıda gösterildiği gibigeçici dosya olmadan Java WAV bayt dizisine ses akışı dönüştürme

java.io.IOException: stream length not specified 

Ben geri okumadan sonra, geçici bir dosyaya wav yazarak çalışmak için başardı: Bunu denerseniz yazık ki, JavaSound size aşağıdaki hatayı eller

Bu açıkça daha az arzu edilir. Daha iyi bir yolu var mı?

cevap

6

Sorun, çoğu AudioFileWriters'ın bir OutputStream'e yazıyorsa dosya boyutunu önceden bilmesi gerektiğidir. Bunu sağlayamayacağınız için, her zaman başarısız olur. Maalesef, varsayılan Java ses API uygulamasının herhangi bir alternatifi yok.

Ama (Tritonus Java ses API açık kaynak uygulamasıdır) Tritonus eklentileri AudioOutputStream mimarisini kullanarak deneyebilirsiniz: http://tritonus.org/plugins.html

+1

Bunu denemeliyim. Denemeden biraz önce olabilir, o zaman cevabı şu anda kabul edemem. Yine de bunu kabul edeceğim. –

-2

Bu çok basit ...

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(); 

.tmp dosyası bir RAW ses dosyasıdır, sonuç başlıklı bir WAV dosyasıdır.

+1

Soru, bir temp dosyası olmadan * yapılıp yapılamayacağını sorar. –

1

Bunun çok uzun zaman önce sorulduğunu görüyorum. Herhangi bir yeni kişinin (Java 7 ve üstü kullanılarak) bu diziyi bulduğu durumda, Files.readAllBytes API'sı aracılığıyla bunu yapmanın daha iyi bir yolu olduğuna dikkat edin. Bakınız: How to convert .wav file into byte array?

1

Çok geç, biliyorum, ama buna ihtiyacım vardı, bu konudaki iki sentim.

public void UploadFiles(String fileName, byte[] bFile) 
{ 
    String uploadedFileLocation = "c:\\"; 

    AudioInputStream source; 
    AudioInputStream pcm; 
    InputStream b_in = new ByteArrayInputStream(bFile); 
    source = AudioSystem.getAudioInputStream(new BufferedInputStream(b_in)); 
    pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source); 
    File newFile = new File(uploadedFileLocation + fileName); 
    AudioSystem.write(pcm, Type.WAVE, newFile); 

    source.close(); 
    pcm.close(); 
} 
-1

Sizin için doğru üstbilgiyi yaratacak olan sınıfı hazırlarsanız sorunu çözmek kolaydır. Benim örneğimde Example how to read audio input in wav buffer veri bir tamponda gider, bundan sonra başlık yaratırım ve tamponda wav dosyası var. Ek kütüphanelere gerek yok. Sadece kodu benim örneğimden kopyala. tampon dizisinde doğru başlığı oluşturur sınıfını nasıl kullanılacağını

Örnek:

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(); 
} 

Ve sınıf Benim bağlantı altındadır bulabilirsiniz NewWaveWriter.

İlgili konular