Я хочу, чтобы можно было получить текущий уровень шума в децибелах (дБ) при нажатии кнопки. Я играю с датчиками и могу заставить их работать легко, но это... Я в тупике. Я пробовал несколько кодов, но никто не работал, или помог мне понять это.
Как это можно достичь?
РЕДАКТИРОВАТЬ:
Я использую следующий код:
private Thread recordingThread;
private int bufferSize = 800;
private short[][] buffers = new short[256][bufferSize];
private int[] averages = new int[256];
private int lastBuffer = 0;
AudioRecord recorder;
boolean recorderStarted = false;
protected void startListenToMicrophone()
{
if (!recorderStarted)
{
recordingThread = new Thread()
{
@Override
public void run()
{
int minBufferSize = AudioRecord.getMinBufferSize(8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(AudioSource.MIC, 8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize * 10);
recorder.setPositionNotificationPeriod(bufferSize);
recorder.setRecordPositionUpdateListener(new OnRecordPositionUpdateListener()
{
@Override
public void onPeriodicNotification(AudioRecord recorder)
{
short[] buffer = buffers[++lastBuffer
% buffers.length];
recorder.read(buffer, 0, bufferSize);
long sum = 0;
for (int i = 0; i < bufferSize; ++i)
{
sum += Math.abs(buffer[i]);
}
averages[lastBuffer % buffers.length] = (int) (sum / bufferSize);
lastBuffer = lastBuffer % buffers.length;
Log.i("dB", ""+averages);
tv4.setText("" + averages[1]);
}
@Override
public void onMarkerReached(AudioRecord recorder)
{
}
});
recorder.startRecording();
short[] buffer = buffers[lastBuffer % buffers.length];
recorder.read(buffer, 0, bufferSize);
while (true)
{
if (isInterrupted())
{
recorder.stop();
recorder.release();
break;
}
}
}
};
recordingThread.start();
recorderStarted = true;
}
}
private void stopListenToMicrophone()
{
if (recorderStarted)
{
if (recordingThread != null && recordingThread.isAlive()
&& !recordingThread.isInterrupted())
{
recordingThread.interrupt();
}
recorderStarted = false;
}
}
}
У меня две кнопки в приложении. Первый вызывает startListenToMicrophone и второй вызывает остановку. Я не понимаю, как это работает. Я получил код отсюда.
Textview получает странное и очень большое значение. Мне нужен уровень звука в децибелах.
Просто мимолетная мысль, и я могу ошибаться, но амплитуда в дБ = 20xlog (S1/S2). Я не мог найти этот расчет в любом месте вашего кода. вам нужно получить S1, который будет текущим записанным уровнем и получить S2, который должен быть максимально возможным для записи. Затем вычислите значение дБ.