2016-07-13 37 views
13

'da Ses Kaydetme Seslerim Uygulamam telefonun mikrofonlarından ses kaydediyor ve üzerinde gerçek zamanlı işleniyor. Fiziksel cihazlarda iyi çalışıyor, ancak emülatörde "komik" davranıyor. Bir şey kaydediyor, ama kaydının ne olduğundan emin değilim.Android Emulator 96khz

Öykünücüde, ses örneklerinin gerçek aygıtlardaki hızın yaklaşık iki katı kadar okunacağı anlaşılıyor. Uygulamada, emülatörde iki kat daha hızlı hareket eden bir görsel ilerleme widget'ına (yatay olarak hareket eden bir kayıt kafasına) sahibim.

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

ses kaynağı "KAMERA" olarak ayarlanır ve stereo olarak kaydeder edilir: Burada

kayıt döngü. Bu fikir, eğer telefonun birden fazla mikrofonu varsa, uygulama her ikisinden de verileri işleyecek ve hangisi daha iyi SNR'ye sahipse kullanacaktır. Ancak AudioSource.MIC'dan mono kaydederken de aynı sorunlara sahibim. Bir while döngüsündeki ses verilerini okur, audioRecord.read()'un engelleme çağrısı olduğunu ve iki kez aynı verileri okumama izin vermeyeceğimi kabul ediyorum.

Kayıtlı veriler düzgün görünüyor - kayıt arabelleği iki kanal için 16 bit PCM örnekleri içeriyor. Döngü sadece gerçek cihazlarda olduğu gibi iki kat hızda çalışıyor gibi görünüyor. Bu, belki de emülatörün belirtilen 44100Hz'den daha yüksek bir örnekleme oranı kullandığını düşünmeme yol açar. Örnek oranını audioRecord.getSampleRate() ile sorgularım, doğru değeri verir.

Ayrıca LogCat bazı ilginç ses ile ilgili mesajlar varken kayıt: Ben kullanıyorum

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 

kadar güncel Android Studio ve Android SDK ve API seviyelerini çalışan emülatör görüntüleri denedi 21- 24. Benim dev ortamım Ubuntu'dur 16.04

Benzer bir şey yaşayan var mı? Kayıt döngümde bir sorun mu yapıyorum?

+0

Dev etkinliğinizde örnek oranlar nelerdir? – CyberJacob

cevap

10

Bunun AudioFormat.CHANNEL_IN_STEREO neden olduğundan şüpheleniyorum. Cihazdaki mikrofon tipik olarak mono ses kaynağıdır. Eğer bazı nedenlerden ötürü emülatör stereoyu destekliyorsa, emülatörde (her iki kanal için) iki kat fazla veri alacaksınız. Bunu doğrulamak için guarantied to work on all devices olan AudioFormat.CHANNEL_IN_MONO'a geçin ve daha sonra emülatörde aynı miktarda veri alıp almadığınızı öğrenin.

+0

"CHANNEL_IN_MONO" olarak değiştirildi ve aynı sorunu yaşadı. Uygulama kodunda yanlış bir şey olmadığını düşünüyorum ve sorun emülatör veya muhtemelen işletim sistemim ile. Play Store'dan alakasız bir "Ses Kaydedici" uygulaması yükledim ve ayrıca çöp kaydetti. Ardından, uygulamamı Genymotion'da çalıştırmayı denedim ve ses kaydı mükemmel bir şekilde çalıştı. –

İlgili konular