Android, получающий амплитуды микрофона в реальном времени, в большинстве случаев возвращает 0

мое приложение позволяет пользователю говорить, и я пытаюсь построить график амплитуд в реальном времени, пока пользователь говорит. Я делаю это с помощью AsyncTask, который сэмплирует MediaRecorder или AudioRecorder (я пробовал оба) каждые x миллисекунд. Даже если я выбираю каждую миллисекунду, 10 миллисекунд или 100 миллисекунд, большинство возвращаемых значений равны 0, хотя я все время говорю в тестах. Массив значений выглядит так: [ 0, 0, 1500, 0, 0, 0, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4500, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0... ] ну вы поняли мой точка. Я что-то упускаю? Спасибо.

Редактировать: кажется, что если я делаю выборку каждые 100 миллисекунд, я получаю что-то вроде этого: [5000, 6000, 7000, 0, 4500, 5000, 0, 7000, 7000, 7500, 8000, 0, 7000] меньше нулей, чем при 10-миллисекундной выборке, но нули все же есть.


person Rotem    schedule 15.03.2014    source источник


Ответы (1)


После исследования я понял, что это имеет прямое отношение к частоте дискретизации (может быть, это очевидно, но я как-то пропускаю это).

Таким образом, установка этого параметра будет выводить твердое число каждые 100 миллисекунд:

this.mediaRecorder.setAudioSamplingRate(8000);

это каждые 40 миллисекунд:

this.mediaRecorder.setAudioSamplingRate(16000);

и это каждые 10 миллисекунд:

this.mediaRecorder.setAudioSamplingRate(44100);

Просто помните, что вы можете использовать 44100 в качестве частоты дискретизации для аудиокодировщика AAC и 16000 для AMR_WB. AMR_NB поддерживает только 8000 в качестве частоты дискретизации.

person Rotem    schedule 31.03.2014