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 в качестве частоты дискретизации.