Meine App zeichnet Audio von den Mikrofonen des Telefons auf und verarbeitet sie in Echtzeit. Es funktioniert gut auf physischen Geräten, wirkt aber im Emulator "witzig". Es zeichnet etwas auf, aber ich bin mir nicht sicher, was es ist, es aufzunehmen.Android Emulator scheint Audio bei 96 kHz aufzunehmen
Es scheint, dass die Audio-Samples im Emulator ungefähr doppelt so schnell gelesen werden wie auf tatsächlichen Geräten. In der App habe ich ein visuelles Fortschritts-Widget (ein horizontal bewegter Aufzeichnungskopf), das sich im Emulator etwa doppelt so schnell bewegt. Hier
ist die Aufnahmeschleife:
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();
Die Audioquelle wird auf "Camcorder" und zeichnet sie in Stereo. Die Idee ist, wenn das Telefon mehrere Mikrofone hat, wird die App Daten von beiden verarbeiten und verwenden, was auch immer SNR hat. Aber ich habe die gleichen Probleme, wenn ich mono von AudioSource.MIC
aufzeichnen. Es liest Audiodaten in einer while
-Schleife, ich gehe davon aus, dass audioRecord.read()
ein Blockieranruf ist und ich die gleichen Daten nicht zweimal lesen lassen kann.
Die aufgezeichneten Daten sehen OK aus - der Aufzeichnungspuffer enthält 16-Bit-PCM-Samples für zwei Kanäle. Die Schleife scheint nur doppelt so schnell zu laufen wie auf echten Geräten. Das bringt mich zu der Annahme, dass der Emulator möglicherweise eine höhere Abtastrate als die angegebenen 44100 Hz verwendet. Wenn ich die Abtastrate mit audioRecord.getSampleRate()
abfrage, wird der korrekte Wert zurückgegeben.
Auch gibt es einige interessante Audio-bezogene Nachrichten in logcat während der Aufnahme:
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
ich up-to-date Android Studio und Android SDK, und ich habe Emulator Bilder versucht API Ebenen laufen 21- 24. Meine Entwicklungsumgebung ist Ubuntu 16.04
Hat jemand etwas ähnliches erlebt? Mache ich etwas falsch in meiner Aufnahmeschleife?
Wie hoch sind die Abtastraten in Ihrer Entwicklungsumgebung? – CyberJacob