Как сделать Visualizer при записи звука в Android

Я знаю, что Visualizer показывает волну при воспроизведении звука с помощью Android Media Player.

Но я хочу, чтобы визуализатор отображался во время записи звука, значит, во время записи я хочу показывать линейную волну, которая изменяется в зависимости от голосового ритма пользователя.

Можно ли сделать в android.


person koti    schedule 26.11.2012    source источник
comment
будет достаточно измерителя уровня, или вам нужен уровень каждой частоты?   -  person elgui    schedule 03.12.2012
comment
мне нужно хотя бы какое-то значение удара, чтобы нарисовать график с помощью графического API   -  person koti    schedule 03.12.2012
comment
график записанных байтов с увеличивающимися интервалами времени. см. ответ ниже   -  person everlasto    schedule 04.12.2012


Ответы (3)


вызывая каждые x миллисекунд ваш MediaRecorder.getMaxAmplitude(), вы получите (из официальная документация):

максимальная абсолютная амплитуда, полученная с момента последнего вызова этого метода.

затем вы можете обработать это значение в режиме реального времени, чтобы нарисовать график или изменить некоторые свойства представления.
не идеально, но надеюсь, что это поможет =)

Изменить: чтобы вы знали, полученное значение будет одинаковым на всех устройствах Android: от 0 до 32767. (У меня есть более 10 000 отчетов пользователей, которые дают мне это значение, когда они дуют в микрофон) .

person elgui    schedule 03.12.2012
comment
нужно указать выходной файл.. Можно ли его пропустить? - person Shashank Kumar; 10.09.2014
comment
нет, нельзя, просто дайте рекордеру такой файл: File cacheDir = getWritableCacheDir(); SamplePath = cacheDir.getAbsolutePath() + /sample; mRecorder.setOutputFile(samplePath); и удалите его, когда закончите... - person elgui; 10.09.2014
comment
@ShashankKumar: или используйте AudioRecorder. (файл не нужен) - person njzk2; 31.10.2014
comment
как использовать этот метод с классом визуализатора, можете ли вы подробно объяснить или предоставить какой-либо пример кода, который может показать все эти функции - person Sahil Garg; 15.09.2015

Две важные вещи:

  • вам нужно преобразовать живые байты (из микрофона) в числовые значения, чтобы построить их.
  • Поскольку вы используете график в реальном времени, для построения этих точек используйте SurfaceView.

    Преобразование байтов записи в числовые значения см.: Android: прослушиватель для записи звука при появлении любого звука, где вы увидите, что переменная «temp» содержит числовое значение вашего звука.

    Точки графика Эти числовые значения, которые указывают ваши значения Y, отображаются в виде графика в зависимости от возрастающих значений X (интервал времени) (0,1,2..). Использование SurfaceView, например..,

//canvas.drawLine(previous X value,previous Y value,X,Y, paint);
canvas.drawPoint(X,Y,paint);
SurfaceHolder.unlockCanvasAndPost(canvas);

Вам не нужно отображать все значения, для эффективности вы можете отфильтровать эти значения с вашими условиями и построить график для определенных интервалов времени.

Надеюсь это поможет :)

person everlasto    schedule 04.12.2012

Возможно, вам придется использовать класс AudioRecorder вместо MediaRecorder.

Проверьте методы AudioRecorder#read(...), которые помещают аудиоданные в byte[] вместо того, чтобы помещать их непосредственно в файл.

Чтобы показать изменения на графике, вам нужно будет проанализировать данные (которые закодированы в PCM 8 или 16 бит - ссылка) и обновлять график в режиме реального времени.

person MeTTeO    schedule 04.12.2012