'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. AncakAudioSource.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?
Dev etkinliğinizde örnek oranlar nelerdir? – CyberJacob