2013-07-22 15 views
6

मुझे अपने ऐप के साथ RECORDING जबकि बफर ओवरफ़्लो मिल रहा है। रिकॉर्डिंग Service में किया जाता है। मुझे पता नहीं लगा कि मुझे यह संदेश AudioFlinger से क्यों प्राप्त हो रहा है।ऑडियो रिकॉर्ड: बफर ओवरफ़्लो?

नीचे मैं AudioRecord ऑब्जेक्ट को तुरंत चालू करता हूं और इसे कॉलबैक सेट करता हूं।

bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); 
aRecorder = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize); 

aRecorder.setRecordPositionUpdateListener(updateListener); 

bytesPerSample = bitsPerSample/8; 
int bytesPerFrame = nChannels * bytesPerSample; 
framePeriod = bufferSize/bytesPerFrame; // nr of frames that can be kept in a bufferSize dimension  
int result = aRecorder.setPositionNotificationPeriod(framePeriod);  
buffer = new byte[bufferSize]; 

audioRecord कॉलबैक:

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener(){ 
     public void onPeriodicNotification(AudioRecord recorder){ 
      int result = aRecorder.read(buffer, 0, buffer.length); 
     } 

     public void onMarkerReached(AudioRecord recorder) 
     {} 
    }; 

मुझे लगता है समस्या से संबंधित है: aRecorder.setPositionNotificationPeriod(framePeriod); - हो सकता है अवधि के लिए इस bufferSiz ई बहुत बड़ा है और एक तेजी से (छोटे) अवधि मुद्दे का समाधान होगा ।

क्या कोई मुझे बता सकता है कि बफर ओवरफ़्लो से कैसे छुटकारा पाएं?

उत्तर

8

मदद करता है कि इस मुद्दे को ठीक करने के लिए, 2 बार न्यूनतम बफर करने के लिए AudioRecord के बफर आकार बदलने आकार।

आप AudioRecord.getMinBufferSize() स्थिर विधि का उपयोग कर सकते हैं। यह आपको आपके वर्तमान प्रारूप के लिए उपयोग करने के लिए न्यूनतम बफर आकार देगा।

getMinBufferSize की वाक्य रचना() विधि है:

public static int getMinBufferSize (
    int sampleRateInHz, int channelConfig, int audioFormat) 

कुछ भी कम AudioRecord वस्तु बनाने के दौरान की तुलना में इस संख्या में विफलता का परिणाम देगा।

आपको बफर आकार को कम करना चाहिए था, ताकि डेटा की मांग के साथ ऑडियो सबसिस्टम को जबरदस्त न किया जाए।

audioRecord कॉलबैक के लिए ओवरराइड विधियों (@Override) डाल करने के लिए इस प्रकार याद रखें:

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener(){ 

     @Override 
     public void onPeriodicNotification(AudioRecord recorder){ 
      int result = aRecorder.read(buffer, 0, buffer.length); 
     } 

     @Override 
     public void onMarkerReached(AudioRecord recorder) 
     {} 
    }; 

मैं पोस्ट पढ़ने के लिए सलाह देते हैं: Android audio recording, part 2

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

इस दृष्टिकोण के लिए खुला स्रोत नमूना कोड: musicg_android_demo

चेक अधिक के लिए इस पोस्ट - android-audiorecord-class-process-live-mic-audio-quickly-set-up-callback-func

+0

के बजाय रिकॉर्ड करने के लिए एक द्वितीयक थ्रेड का उपयोग करता है, आपके उत्तर के लिए धन्यवाद, सभी डेटा प्रोसेसिंग द्वितीयक धागे में किया जाता है। बफर आकार को स्थिर विधि od AudioRecord (getMinBufSize) का उपयोग करके लिया जाता है। @overwrite वास्तव में गायब था। –

+0

और मैंने कल मिनीबफसाइज को 2 से गुणा करने की कोशिश की, लेकिन ~ 30 सेकंड में "बफर ओवरवॉ" संदेश की आवृत्ति को कम कर रहा था। वैसे भी, 2 के साथ गुणा करना अब तक का सबसे अच्छा संस्करण था, लेकिन मैं इसे पूरी तरह से छुटकारा पाना चाहता हूं, क्योंकि मेरी रिकॉर्डिंग 1: 3 घंटे के बाद बंद हो जाती है। –

+0

तो इसका मतलब है कि 2 के साथ गुणा करने के बाद, कोई बफर ओवरफ़्लो समस्या नहीं है लेकिन रिकॉर्डिंग कुछ समय के बाद बंद हो रही है? आप इसे जारी करने से पहले रिकॉर्डर रीसेट करने का प्रयास कर सकते हैं। –

1

यही है क्योंकि:

framePeriod = bufferSize/bytesPerFrame; 

आप गुणा करने के लिए और अपने buffersize विभाजित नहीं की जरूरत है।

साथ प्रयास करें:

framePeriod = bufferSize * bytesPerFrame; 

और अगर आप एक नमूना की जरूरत है: here is a complete audio capture class

आशा है कि यह

+0

धन्यवाद। बफर को निम्नानुसार तत्काल किया जाना चाहिए: बफर = नया बाइट [फ्रेमपीरियोड * बाइट्सपरफ्रेम]? –

+0

मैं आपके द्वारा प्रदान किए गए लिंक का पालन करने का प्रयास करूंगा।मैंने देखा कि यह कॉलबैक संस्करण (ऑनपेरियोडिक नोटिफिकेशन) –

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