2016-07-13 11 views
13

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?

+0

Wie hoch sind die Abtastraten in Ihrer Entwicklungsumgebung? – CyberJacob

Antwort

10

Ich vermute, dass es durch AudioFormat.CHANNEL_IN_STEREO verursacht wird. Ein Mikrofon am Gerät ist in der Regel eine Mono-Audioquelle. Wenn aus irgendeinem Grund der Emulator Stereo unterstützt, erhalten Sie doppelt so viele Daten auf dem Emulator (für beide Kanäle). Um dies zu überprüfen, versuchen Sie, zu AudioFormat.CHANNEL_IN_MONO, das guarantied to work on all devices ist, zu wechseln, und sehen Sie, ob Sie dieselbe Menge an Daten dann auf Emulator erhalten.

+0

Auf 'CHANNEL_IN_MONO' umgeschaltet und hatte das gleiche Problem. Ich denke, im App-Code ist nichts falsch, und das Problem liegt beim Emulator oder möglicherweise bei meinem Betriebssystem. Ich habe eine nicht verwandte "Sound Recorder" -App von Play Store installiert, und es wurde auch Müll aufgezeichnet. Dann habe ich versucht, meine App in Genymotion laufen zu lassen und die Tonaufnahme funktionierte perfekt. –

Verwandte Themen