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, 0, 150, 0, 0, 0, 0, 0... ] хорошо, вы получите мой точка. Я что-то пропустил? Спасибо.

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

1 ответ

Решение

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

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

this.mediaRecorder.setAudioSamplingRate(8000);

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

this.mediaRecorder.setAudioSamplingRate(16000);

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

this.mediaRecorder.setAudioSamplingRate(44100);

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

Другие вопросы по тегам