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:
Merci.
Utilisez mRecorder.getMaxAmplitude();
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;
}
}
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!
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é.