2012-11-21 11 views
8

मुझे ऑडियो रिकॉर्डॉर्ड क्लास का उपयोग करके कुछ समस्याएं हैं। मैं एक बफर में दर्ज डेटा स्टोर करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि इसे प्राप्त करने का सही तरीका क्या है। मैं बड़ी संख्या में उदाहरणों के माध्यम से चला गया, लेकिन उनमें से अधिकतर कॉम्प्लेटेड थे और कई अलग-अलग दृष्टिकोणों का प्रतिनिधित्व करते थे। मैं सरल एक या सरल स्पष्टीकरण की तलाश में हूं।ऑडियो रिकॉर्ड - बफर में डेटा कैसे प्राप्त करें?

int audioSource = AudioSource.MIC; 
int sampleRateInHz = 8000; 
int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 

short[] buffer = new short[bufferSizeInBytes]; 

AudioRecord audioRecorder = new AudioRecord(audioSource, 
              sampleRateInHz, 
              channelConfig, 
              audioFormat, 
              bufferSizeInBytes); 

मैं एक रिकॉर्डिंग समारोह बनाने का प्रयास कर रहा हूँ:

public void Recording() { 
    audioRecorder.startRecording(); 
    ... 
    audioRecorder.stop(); 
    audioRecorder.release(); 
} 

मुझे पता है कि मैं 'मी .read का उपयोग करने वाले (लघु

यहाँ मेरी परियोजना के लिए मेरे ऑडियो सेटिंग नहीं है [] ऑडियोडेटा, int offsetInShorts, int sizeInShorts) फ़ंक्शन। और यहां मेरी समस्याएं शुरू होती हैं। मुझे यकीन नहीं है कि ऑडियोडेटा बफर कैसे काम करता है - मुझे लगता है कि फ़ंक्शन ऑडियोडेटा में रिकॉर्ड किए गए नमूने रखता है। क्या होता है अगर यह पूरी तरह से डेटा से भर जाता है? यह सबसे पुरानी स्थिति से फिर से लिखना शुरू करता है? अगर मुझे विश्वास है कि मुझे कहीं और एकत्र किए गए नमूने कॉपी करना है। यह एक और सवाल उठाता है - मैं कैसे जांच सकता हूं कि .read (...) फ़ंक्शन बफर पहले से भर चुका है? क्या मुझे समय मापने और बफर सामग्री की प्रतिलिपि बनाने की आवश्यकता है या उस तक पहुंचने का दूसरा तरीका है? क्या मुझे पूरे रिकॉर्डिंग ऑपरेशन के लिए धागा बनाने की ज़रूरत है?

अपने प्रश्नों के एक विषय :)

उत्तर

3

उत्तर में इतने सारे सवाल पूछ ::

recorder.read (...) जरूरी कोई भी डेटा नहीं पढ़ता लिए खेद है। आपको पढ़ने के लिए कॉल के बीच थोड़ी देर (उदा।, 50 एमएमएस) के लिए रोकने के लिए उस लूप को शायद लिखना चाहिए। बफर के डेटा तक इसे बफर कतार भी नहीं करना चाहिए। साथ ही, चूंकि बफर पूर्ण नहीं हो सकता है, इसलिए आपको शायद एक डेटा संरचना का उपयोग करने की आवश्यकता है जो बाइट्स की संख्या को गिनती रखती है। एक बाइटबफर एक अच्छे उम्मीदवार के रूप में दिमाग में आता है। आप इसे लूप को रीड लूप में रख सकते हैं और जब यह पर्याप्त हो जाता है, तो इसे ट्रांसमिशन के लिए कतार दें और दूसरा शुरू करें।

ऑफकोर्स आपको इसे लूप करने के लिए थ्रेड बनाने की आवश्यकता है। जैसा कि नीचे कोड में दिखाया गया है।

यहां रिकॉर्डिंग पाश का एक संशोधित संस्करण है जो उचित त्रुटि जांच करता है।

private void startRecording() { 

    recorder.startRecording(); 
    isRecording = true; 
    recordingThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      bData = ByteBuffer.allocate(BufferElements); 
      bbarray = new byte[bData.remaining()]; 
      bData.get(bbarray); 
      while (isRecording) { 

       int result = recorder.read(bbarray, 0, BufferElements); 
       System.out.println("READ DATA"); 
       if (result > 0) { 
        qArray.add(bData); 

        --your stuffs-- 
        bData = ByteBuffer.allocate(BufferElements); 
       } else if (result == AudioRecord.ERROR_INVALID_OPERATION) { 
        Log.e("Recording", "Invalid operation error"); 
        break; 
       } else if (result == AudioRecord.ERROR_BAD_VALUE) { 
        Log.e("Recording", "Bad value error"); 
        break; 
       } else if (result == AudioRecord.ERROR) { 
        Log.e("Recording", "Unknown error"); 
        break; 
       } 
       try { 
        Thread.sleep(10); 
       } catch (InterruptedException e) { 
        break; 
       } 
      } 
     } 
    }, "AudioRecorder Thread"); 
    recordingThread.start(); 
} 
बेशक

, कहीं आप recorder.startRecording() कॉल करने के लिए की आवश्यकता होगी या आप किसी भी डेटा नहीं मिलेगा: यह एक Queue<ByteBuffer> बजाय एक Queue<byte[]> का उपयोग करता है।

कार्य नमूना देखने के लिए at this example

+0

** qArray ** यहां क्या है? – OnePunchMan

+0

सरणी सूची हो सकती है। मुझे अब याद नहीं आया। इस उदाहरण को संदर्भित करने के लिए बेहतर http://stackoverflow.com/questions/8499042/android-audiorecord-example/13487250#13487250 –

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