2016-07-13 5 views
13

पर ऑडियो रिकॉर्ड करने के लिए लगता है मेरा ऐप फोन के माइक्रोफ़ोन से ऑडियो रिकॉर्ड कर रहा है और कुछ वास्तविक समय प्रसंस्करण करता है। यह भौतिक उपकरणों पर ठीक काम कर रहा है, लेकिन एम्यूलेटर में "मजेदार" काम करता है। यह कुछ रिकॉर्ड करता है, लेकिन मुझे पूरा यकीन नहीं है कि यह रिकॉर्डिंग क्या है।एंड्रॉइड एमुलेटर 96khz

ऐसा लगता है कि एमुलेटर पर ऑडियो नमूने वास्तविक उपकरणों के अनुसार लगभग दोगुनी दर पर पढ़ा जा रहा है। ऐप में मेरे पास एक दृश्य प्रगति विजेट (एक क्षैतिज चलती रिकॉर्डिंग हेड) है, जो एमुलेटर में लगभग दोगुनी तेजी से चलता है।

int FREQUENCY = 44100; 
int BLOCKSIZE = 110; 

int bufferSize = AudioRecord.getMinBufferSize(FREQUENCY, 
     AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT) * 10; 

AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.CAMCORDER, 
     FREQUENCY, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
     bufferSize); 

short[] signal = new short[BLOCKSIZE * 2]; // Times two for stereo 

audioRecord.startRecording(); 

while (!isCancelled()) { 
    int bufferReadResult = audioRecord.read(signal, 0, BLOCKSIZE * 2); 
    if (bufferReadResult != BLOCKSIZE * 2) 
     throw new RuntimeException("Recorded less than BLOCKSIZE x 2 samples:" 
       + bufferReadResult); 

    // process the `signal` array here 
} 

audioRecord.stop(); 
audioRecord.release(); 

ऑडियो स्रोत "CAMCORDER" पर सेट है और यह स्टीरियो में रिकॉर्ड:

यहाँ रिकॉर्डिंग पाश है। विचार यह है कि, यदि फोन में कई माइक्रोफ़ोन हैं, तो ऐप दोनों से डेटा संसाधित करेगा और जो भी बेहतर एसएनआर का उपयोग करेगा। लेकिन AudioSource.MIC से मोनो रिकॉर्ड करते समय मुझे एक ही समस्या है। यह while लूप में ऑडियो डेटा पढ़ता है, मुझे लगता है कि audioRecord.read() एक अवरुद्ध कॉल है और मुझे दो बार एक ही डेटा पढ़ने नहीं देगा।

रिकॉर्ड किया गया डेटा ठीक दिखता है - रिकॉर्ड बफर में दो चैनलों के लिए 16-बिट पीसीएम नमूने होते हैं। लगता है कि लूप वास्तविक उपकरणों के मुकाबले गति से दोगुना चल रहा है। जो मुझे लगता है कि शायद एमुलेटर निर्दिष्ट 44100Hz की तुलना में उच्च नमूना दर का उपयोग कर रहा है। यदि मैं audioRecord.getSampleRate() के साथ नमूना दर से पूछता हूं तो यह सही मान देता है।

इसके अलावा logcat में कुछ दिलचस्प ऑडियो संबंधित संदेश हैं, जबकि रिकॉर्डिंग:

07-13 12:22:02.282 1187 1531 D AudioFlinger: mixer(0xf44c0000) throttle end: throttle time(154) 
(...) 
07-13 12:22:02.373 1187 1817 E audio_hw_generic: Error opening input stream format 1, channel_mask 0010, sample_rate 16000 
07-13 12:22:02.373 1187 3036 I AudioFlinger: AudioFlinger's thread 0xf3bc0000 ready to run 
07-13 12:22:02.403 1187 3036 W AudioFlinger: RecordThread: buffer overflow 
(...) 
07-13 12:22:24.792 1187 3036 W AudioFlinger: RecordThread: buffer overflow 
07-13 12:22:30.677 1187 3036 W AudioFlinger: RecordThread: buffer overflow 
07-13 12:22:37.722 1187 3036 W AudioFlinger: RecordThread: buffer overflow 

मैं उपयोग कर रहा हूँ अप-टू-डेट एंड्रॉयड स्टूडियो और Android SDK और मैं API स्तरों चल एमुलेटर छवियों की कोशिश की है 21- 24। मेरा देव पर्यावरण उबंटू 16.04

क्या किसी ने कुछ ऐसा अनुभव किया है? क्या मैं अपने रिकॉर्डिंग पाश में कुछ गलत कर रहा हूं?

+0

आपके देव पर्यावरण पर नमूना दर क्या हैं? – CyberJacob

उत्तर

10

मुझे संदेह है कि यह AudioFormat.CHANNEL_IN_STEREO के कारण होता है। डिवाइस पर एक माइक आमतौर पर एक मोनो ऑडियो स्रोत होता है। अगर किसी कारण से एमुलेटर स्टीरियो का समर्थन करता है, तो आपको एमुलेटर (दोनों चैनलों के लिए) पर दो गुना अधिक डेटा प्राप्त होगा। इसे सत्यापित करने के लिए, AudioFormat.CHANNEL_IN_MONO पर स्विच करने का प्रयास करें, जो guarantied to work on all devices है, और देखें कि क्या आप एमुलेटर पर उसी मात्रा में डेटा प्राप्त करते हैं या नहीं।

+0

'CHANNEL_IN_MONO' पर स्विच किया गया था और एक ही समस्या थी। मुझे लगता है कि ऐप कोड में कुछ भी गलत नहीं है, और यह मुद्दा एमुलेटर या संभवतः मेरे ओएस के साथ है। मैंने प्ले स्टोर से एक असंबंधित "साउंड रिकॉर्डर" ऐप स्थापित किया, और इसमें कचरा भी दर्ज किया गया। फिर मैंने जेनमोशन में अपना ऐप चलाने की कोशिश की और ध्वनि रिकॉर्डिंग पूरी तरह से काम किया। –

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