2008-10-13 14 views
7

को देखते हुए एक InputStream बुलाया in जो (जैसे एमपी 3 या OGG के रूप में) एक संपीड़ित प्रारूप में ऑडियो डेटा होता है, मैं इनपुट के एक WAV रूपांतरण युक्त एक byte सरणी बनाना चाहते हैं डेटा। दुर्भाग्यवश, अगर आप ऐसा करने के लिए प्रयास करते हैं, JavaSound आपको निम्न त्रुटि हाथ:अस्थायी फ़ाइल के बिना जावा में WAV बाइट सरणी में कनवर्ट ऑडियो स्ट्रीम

java.io.IOException: stream length not specified 

मैं, एक अस्थायी फ़ाइल के लिए wav लेखन, इसे वापस में पढ़ने तब तक काम करने के लिए इसे पाने के लिए प्रबंधित के रूप में नीचे दिखाया गया है:

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; 

यह स्पष्ट रूप से कम वांछनीय है। क्या कोई बेहतर तरीका है?

उत्तर

6

समस्या यह है कि आउटपुटस्ट्रीम पर लिखने पर सबसे ऑडियोफाइल राइटर्स को फ़ाइल आकार को पहले से ही जानना होगा। क्योंकि आप इसे प्रदान नहीं कर सकते हैं, यह हमेशा विफल रहता है। दुर्भाग्य से, डिफ़ॉल्ट जावा ध्वनि एपीआई कार्यान्वयन में कोई विकल्प नहीं है।

लेकिन आप (Tritonus जावा ध्वनि एपीआई का एक खुला स्रोत कार्यान्वयन है) Tritonus प्लग इन से AudioOutputStream वास्तुकला का उपयोग कर प्रयास कर सकते हैं: http://tritonus.org/plugins.html

+1

मुझे इसे आज़मा देना होगा। इससे पहले कि मैं कोशिश कर सकूं, यह थोड़ा सा हो सकता है, इसलिए मैं इस समय जवाब स्वीकार नहीं कर सकता। हालांकि, मैं इसे ऊपर उठाऊंगा। –

-2

यह बहुत सरल है ...

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 फ़ाइल एक रॉ ऑडियो फ़ाइल है, परिणाम हेडर के साथ एक WAV फ़ाइल है।

+1

प्रश्न पूछता है कि यह * बिना * एक temp फ़ाइल के किया जा सकता है। –

1

मुझे पता है कि यह बहुत समय पहले पूछा गया था। यदि कोई नया व्यक्ति (जावा 7 और ऊपर का उपयोग करके) इस धागे को मिला, तो ध्यान दें कि Files.readAllBytes API के माध्यम से इसे करने का एक बेहतर नया तरीका है। देखें: How to convert .wav file into byte array?

1

बहुत देर हो चुकी है, मुझे पता है, लेकिन मुझे इसकी आवश्यकता थी, इसलिए यह विषय पर मेरे दो सेंट हैं।

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

यदि आप कक्षा तैयार करते हैं तो समस्या हल करना आसान है जो आपके लिए सही शीर्षलेख बनाएगा। मेरे उदाहरण में Example how to read audio input in wav buffer डेटा कुछ बफर में जाता है, उसके बाद मैं शीर्षलेख बनाता हूं और बफर में WAV फ़ाइल करता हूं। अतिरिक्त पुस्तकालयों में कोई ज़रूरत नहीं है। बस मेरे उदाहरण से कोड कॉपी करें।

उदाहरण कैसे वर्ग जो बफर सरणी में सही हेडर बनाता है उपयोग करने के लिए:

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

और वर्ग तुम मेरे लिंक के तहत प्राप्त कर सकते हैं NewWaveWriter।

संबंधित मुद्दे