Как получить уровень шума с помощью встроенного микрофона в Android

1

Я хочу, чтобы можно было получить текущий уровень шума в децибелах (дБ) при нажатии кнопки. Я играю с датчиками и могу заставить их работать легко, но это... Я в тупике. Я пробовал несколько кодов, но никто не работал, или помог мне понять это.

Как это можно достичь?

РЕДАКТИРОВАТЬ:

Я использую следующий код:

    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 получает странное и очень большое значение. Мне нужен уровень звука в децибелах.

  • 0
    возможный дубликат уровня шума запроса в Android
  • 0
    Я исследовал это. Решение, предоставленное там, не сработало.
Показать ещё 2 комментария
Теги:
noise
level

1 ответ

2

Просто мимолетная мысль, и я могу ошибаться, но амплитуда в дБ = 20xlog (S1/S2). Я не мог найти этот расчет в любом месте вашего кода. вам нужно получить S1, который будет текущим записанным уровнем и получить S2, который должен быть максимально возможным для записи. Затем вычислите значение дБ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню