web-dev-qa-db-fra.com

android: Détecter le niveau sonore

En utilisant MediaRecorder je capture le son du microphone de l'appareil. Du son que je reçois, je n'ai besoin que d'analyser le volume sonore (intensité sonore), sans enregistrer le son dans un fichier.

Deux questions:

  1. Comment obtenir le volume du son à un moment donné?
  2. Comment faire l'analyse sans enregistrer le son dans un fichier?

Merci.

31
Zelter Ady
  1. Utilisez mRecorder.getMaxAmplitude();

  2. Pour analyser le son sans enregistrer, il vous suffit d'utiliser mRecorder.setOutputFile("/dev/null");

Voici un exemple, j'espère que cela aide

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;

    }
}
43
Ana Llera

Si vous souhaitez analyser un échantillon de son provenant directement du microphone sans enregistrer les données dans un fichier, vous devez utiliser l'objet AudioRecord comme suit:

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);
}

Ensuite, vous devez commencer l'enregistrement lorsque vous êtes prêt:

audio.startRecording();

Il est maintenant temps de commencer à lire des échantillons comme suit:

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));

Le dernier code combine toutes les différentes amplitudes d'échantillons et attribue la moyenne à la variable lastLeveL, pour plus de détails vous pouvez aller à ceci post .

Cordialement!

6
Martin Cazares

J'ai joué avec quelques applications de code source d'enregistrement sonore, mais il a fallu un certain temps pour l'obtenir.

Vous pouvez copier le code source NoiseAlert de Google - le code SoundMeter, qui est ce que j'ai utilisé.

getMaxAmplitude varie de 0 à 32768. Les trucs EMA que je n'ai pas pris la peine d'utiliser.

Dans votre activité principale, vous devez déclarer un objet MediaRecorder et appeler sa fonction start () comme Anna l'a cité.

Pour plus d'informations, vous pouvez vous référer à mon projet: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send -data-from-Android-to-arduino-bluesmirf-silver-using-bluetooth / Où je devais envoyer la valeur de l'amplitude du son sur BlueTooth.

Le code exact est ici: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

Parcourez simplement les parties qui ont quelque chose à voir avec l'objet MediaRecorder associé.

3
Gary