2016-07-13 19 views
13

La mia app sta registrando l'audio dai microfoni del telefono e si sta elaborando in tempo reale su di esso. Funziona bene sui dispositivi fisici, ma funziona in modo "divertente" nell'emulatore. Registra qualcosa, ma non sono abbastanza sicuro di cosa stia registrando.Emulatore Android sembra registrare audio a 96khz

Sembra che sull'emulatore i campioni audio vengano letti a circa il doppio di quelli effettivi. Nell'app ho un widget di avanzamento visivo (una testina di registrazione in movimento orizzontale), che si muove circa due volte più velocemente nell'emulatore.

Ecco il ciclo di registrazione:

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

La sorgente audio è impostata su "Camcorder" e registra in stereo. L'idea è che se il telefono ha più microfoni, l'app elaborerà i dati da entrambi e utilizzerà l'SNR migliore. Ma ho gli stessi problemi se si registra mono da AudioSource.MIC. Legge i dati audio in un ciclo while, suppongo che audioRecord.read() sia una chiamata bloccante e non mi consenta di leggere gli stessi dati due volte.

I dati registrati sembrano OK - il buffer di registrazione contiene campioni PCM a 16 bit per due canali. Il ciclo sembra funzionare al doppio della velocità rispetto ai dispositivi reali. Il che mi porta a pensare che forse l'emulatore sta usando una frequenza di campionamento più alta rispetto al 44100Hz specificato. Se interrogo la frequenza di campionamento con audioRecord.getSampleRate(), restituisce il valore corretto.

ci sono anche alcuni messaggi relativi audio interessanti logcat durante la registrazione:

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 

sto usando up-to-date Android Studio e Android SDK, e ho cercato le immagini emulatore in esecuzione livelli API 21- 24. Il mio ambiente di sviluppo è Ubuntu 16.04

Qualcuno ha riscontrato qualcosa di simile? Sto facendo qualcosa di sbagliato nel mio ciclo di registrazione?

+0

Quali sono le frequenze di campionamento sul tuo ambiente di sviluppo? – CyberJacob

risposta

10

Sospetto che sia causato da AudioFormat.CHANNEL_IN_STEREO. Un microfono sul dispositivo è in genere una fonte audio mono. Se per qualche ragione l'emulatore supporta lo stereo, riceverai il doppio dei dati sull'emulatore (per entrambi i canali). Per verificare ciò, provare a passare a AudioFormat.CHANNEL_IN_MONO, che è guarantied to work on all devices, e vedere se si riceve la stessa quantità di dati sull'emulatore quindi.

+0

Passato a 'CHANNEL_IN_MONO' e ha avuto lo stesso problema. Penso che non ci sia nulla di sbagliato nel codice dell'app, e il problema è con l'emulatore o forse il mio sistema operativo. Ho installato un'app "Sound Recorder" non correlata da Play Store e ha anche registrato dei rifiuti. Poi ho provato a eseguire la mia app su Genymotion e la registrazione del suono ha funzionato perfettamente. –

Problemi correlati