Android: определить уровень звука

С помощью MediaRecorder Я фиксирую звук с микрофона устройства. По полученному звуку мне нужно только проанализировать громкость звука (громкость звука), не сохраняя звук в файл.

Два вопроса:

  1. Как мне получить громкость звука в данный момент времени?
  2. Как выполнить анализ без сохранения звука в файл?

Спасибо.

3 ответа

Решение
  1. использование mRecorder.getMaxAmplitude();

  2. Для анализа звука без сохранения все, что вам нужно, это использовать mRecorder.setOutputFile("/dev/null");

Вот пример, надеюсь, это поможет

public class SoundMeter {

    private MediaRecorder mRecorder = null;

    public void start() {
            if (mRecorder == null) {
                    mRecorder = new MediaRecorder();
                    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    mRecorder.setOutputFile("/dev/null"); 
                    mRecorder.prepare();
                    mRecorder.start();
            }
    }

    public void stop() {
            if (mRecorder != null) {
                    mRecorder.stop();       
                    mRecorder.release();
                    mRecorder = null;
            }
    }

    public double getAmplitude() {
            if (mRecorder != null)
                    return  mRecorder.getMaxAmplitude();
            else
                    return 0;

    }
}

Если вы хотите проанализировать образец звука, взятого непосредственно с микрофона, без сохранения данных в файле, вам необходимо использовать объект AudioRecord следующим образом:

int sampleRate = 8000;
try {
    bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO,
        AudioFormat.ENCODING_PCM_16BIT);
    audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize);
} catch (Exception e) {
    android.util.Log.e("TrackingFlow", "Exception", e);
}

Затем вы должны начать запись, когда будете готовы:

audio.startRecording();

Теперь пришло время начать чтение образцов следующим образом:

short[] buffer = new short[bufferSize];

    int bufferReadResult = 1;

    if (audio != null) {

        // Sense the voice...
        bufferReadResult = audio.read(buffer, 0, bufferSize);
        double sumLevel = 0;
        for (int i = 0; i < bufferReadResult; i++) {
            sumLevel += buffer[i];
        }
        lastLevel = Math.abs((sumLevel / bufferReadResult));

Последний код объединяет все различные амплитуды сэмплов и присваивает среднее значение переменной lastLeveL, более подробно вы можете перейти к этому сообщению.

С уважением!

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

Вы можете скопировать исходный код Google NoiseAlert - код SoundMeter, который я и использовал.

getMaxAmplitude колеблется от 0 до 32768. Материал EMA, который я не потрудился использовать.

В своей основной деятельности вы должны объявить объект MediaRecorder и вызвать его функцию start(), как указано в кавычке Анны.

Для получения дополнительной информации, вы можете обратиться к моему проекту: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-i-e-how-to-transmit-send-data-from-android-to-arduino-bluesmirf-silver-using-bluetooth/ Где мне нужно было отправить значение амплитуды звука через BlueTooth.

Точный код здесь: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

Просто просмотрите части, которые имеют какое-либо отношение к связанному объекту MediaRecorder.

Другие вопросы по тегам