Используя AudioRecord , вы можете получить доступ к аудиосэмплам напрямую ... оттуда вы можете вычислить громкость звука в децибелах или любым другим способом ...
Этот , кажется, тоже относится к тому же вопросу (и имеет формулу для расчета)
РЕДАКТИРОВАТЬ (на основе комментариев и дополнительного кода):
Теперь, переменная data [], которую вы используете, объявлена ли она как массив, байты или шорты? Это изменит то, какая из функций read () будет использоваться. Если вы объявите это как шорты, то это позаботится о ваших 16 битах. Если вы объявите его как массив байтов, вам придется объединить два последовательных байта.
Вам не нужно беспокоиться об отрицательных и положительных значениях, вы просто должны объявить data [] как массив «unsigned short».
Вы должны понимать, что значение в децибелах сравнивает ваш текущий объем с чем-то другим. Я не совсем эксперт, но я считаю, что большую часть времени вы сравниваете его с максимально возможной амплитудой. Я полагаю, что прямо сейчас вычисление, которое вы делаете, сравнивает две последовательные выборки, поэтому значение довольно низкое ... Вместо p1 используйте значение 65535 (это максимально возможное значение). Тогда вы должны увидеть, что значение децибела является отрицательным значением, когда ничего нет, и должно увеличиваться с шумом (но все равно оставаться отрицательным).
РЕДАКТИРОВАТЬ (на основе последнего кода):
Поскольку размер выборки составляет 16 бит, используйте шорты ...
short buffer[] = new short[bufferSize];
read = recorder.read(buffer, 0, bufferSize);
double p2 = data[data.length-1];
double decibel;
if (p2==0)
decibel=Double.NEGATIVE_INFINITY;
else
decibel = 20.0*Math.log10(p2/65535.0);
Попробуйте напечатать все значения по пути (data [data.length-1], p2, p2 / 65535, Math.log10 (p2 / 65535) ... и т. Д.)), Где вы найдете 0 подходит там, где не должно быть.