2011-11-03 28 views
6

मैं भाषण डेटा संचारित करने के लिए आवश्यक बैंडविड्थ पर सहेजने के लिए कच्चे पीसीएम डेटा को एन्कोड करने की कोशिश कर रहा हूं।एंड्रॉइड पीसीएम को यूला एन्कोडिंग WAV फ़ाइल

मैं एक वर्ग UlawEncoderInputStreamThis page पर बुलाया भर में आ गए हैं लेकिन कोई प्रलेखन है! :(

निर्माता कोड के माध्यम से देखने के बाद एक इनपुट स्ट्रीम और एक अधिकतम पीसीएम मूल्य (जो कि है) लेता है।

/** 
    * Create an InputStream which takes 16 bit pcm data and produces ulaw data. 
    * @param in InputStream containing 16 bit pcm data. 
    * @param max pcm value corresponding to maximum ulaw value. 
    */ 
    public UlawEncoderInputStream(InputStream in, int max) { 

, मुझे लगता है कि मैं एक आपूर्ति का उपयोग कर इस "अधिकतम" मूल्य की गणना करना चाहिए फंक्शन: maxAbsPcm। समस्या यह है कि, मैं वास्तव में समझ नहीं पा रहा हूं कि मुझे इसमें क्या गुजरना है! मैं अपने कच्चे पीसीएम को एसडीकार्ड पर एक फाइल में रिकॉर्ड कर रहा हूं, इसलिए मेरे पास पास करने के लिए डेटा की एक सतत स्मृति निवासी सरणी नहीं है

/** 
    * Compute the maximum of the absolute value of the pcm samples. 
    * The return value can be used to set ulaw encoder scaling. 
    * @param pcmBuf array containing 16 bit pcm data. 
    * @param offset offset of start of 16 bit pcm data. 
    * @param length number of pcm samples (not number of input bytes) 
    * @return maximum abs of pcm data values 
    */ 
    public static int maxAbsPcm(byte[] pcmBuf, int offset, int length) { 

इस कोड का उपयोग करने वाली एक और समस्या यह है कि मैं अनिश्चित हूं कि यूएलओ डेटा के लिए हेडर के लिए क्या मूल्य लिखना है। मैं कैसे निर्धारित करूं कि यूएलओ के साथ एन्कोडिंग के बाद कितना कम बाइट डेटा है?

मैंने वीएलसी मीडिया प्लेयर (केवल एकमात्र खिलाड़ी जो फ़ाइल को पढ़ने का प्रयास करेगा) में बनाई गई (संभावित रूप से) यूएलओ एन्कोडेड फ़ाइलों में से एक की बात सुनी है और इसकी आवाज़ खराब, टूटी हुई और क्लिकी है लेकिन अभी भी बना सकती है आवाज बाहर करो।

मैं एक वर्ग मैं WaveHeader बुलाया पाया Here पाया जा सकता है के लिए इसी तरह कोड का उपयोग कर मेरी लहर हैडर लिख रहा हूँ!

किसी को भी इस मामले पर कोई विचार है, तो मैं सबसे उन्हें सुनने के लिए आभारी होंगे! :)

बहुत धन्यवाद डेक्सटर

+0

यदि आप एक .wav फ़ाइल बना रहे हैं। शुरुआत में तरंग हेडर फ़ाइल स्टोर करें और अपनी रिकॉर्डिंग के अंत में इसे वापस बदलें। आम तौर पर, जब तक आप अंत तक नहीं पहुंच जाते, तब तक आप आकार (रिकॉर्ड की संख्या) नहीं जान पाएंगे। आपका अधिकतम वैसे भी 0x7f होना चाहिए। –

उत्तर

4

max निर्माता में पीसीएम डेटा में अधिकतम आयाम है। इसका उत्पादन आउटपुट उत्पन्न करने से पहले इनपुट को स्केल करने के लिए किया जाता है। यदि इनपुट बहुत ज़ोरदार है तो आपको उच्च मूल्य की आवश्यकता है, अगर यह शांत है तो आपको कम की आवश्यकता है। यदि आप 0 में पास करते हैं तो एन्कोडर डिफ़ॉल्ट रूप से 8192 का उपयोग करेगा, जो पर्याप्त हो सकता है।

length अन्य विधि में 16-बिट नमूने की संख्या है जिससे आप अधिकतम आयाम खोजना चाहते हैं। इस वर्ग मानता है कि इनपुट पीसीएम डेटा हमेशा 16-बिट के नमूने, जिसका अर्थ है प्रत्येक नमूने दो बाइट्स तक फैला है कि के साथ इनकोडिंग है: यदि आपके इनपुट के 2000 बाइट्स लंबे आप 1000 नमूने है।

इस वर्ग में इनकोडर को हर 16-बिट पीसीएम नमूने के लिए एक 8 बिट μ-कानून नमूना पैदा करता है, तो बाइट में आकार आधा कर दिया गया है।

+0

धन्यवाद बहुत बहुत जोनी –

0

यह तुम क्या करने कोशिश कर रहे हैं के विपरीत है, लेकिन मैंने सोचा कि यह किसी के लिए उपयोगी हो सकता है। यहां एक अपूर्ण विधि है जो अंतर्निहित जावा विधियों का उपयोग करके एक 8-बिट यूएलए एन्कोडेड बाइनरी फ़ाइल को 16-बिट WAV फ़ाइल में परिवर्तित कर देगी।

public static void convertULawFileToWav(String filename) { 
    File file = new File(filename); 
    if (!file.exists()) 
     return; 
    try { 
     long fileSize = file.length(); 
     int frameSize = 160; 
     long numFrames = fileSize/frameSize; 
     AudioFormat audioFormat = new AudioFormat(Encoding.ULAW, 8000, 8, 1, frameSize, 50, true); 
     AudioInputStream audioInputStream = new AudioInputStream(new FileInputStream(file), audioFormat, numFrames); 
     AudioSystem.write(audioInputStream, Type.WAVE, new File("C:\\file.wav")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}