it-swarm.com.de

Android: Beispielmikrofon ohne Aufnahme, um Live-Amplitude/Pegel zu erhalten?

Ich habe versucht, den Amplitudenpegel eines Mikrofons unter Android folgendermaßen zu ermitteln:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

Timer timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000);

private class RecorderTask extends TimerTask {
    private MediaRecorder recorder;

    public RecorderTask(MediaRecorder recorder) {
        this.recorder = recorder;
    }

    public void run() {
        Log.v("MicInfoService", "amplitude: " + recorder.getMaxAmplitude());
    }
}

Leider gibt dies immer nur 0 zurück.

Damit dies funktioniert, muss ich anscheinend mit der Aufnahme beginnen. Ist das korrekt?

Wenn ja, muss ich 500 ms aufnehmen, die Amplitude abrufen, die Aufnahme stoppen und wiederholen?

Muss ich schließlich in eine Datei aufnehmen? Ich muss diese Audiodatei nicht speichern. Kann ich nicht einfach die aktuelle Amplitude oder die höchste Amplitude seit dem letzten Aufruf des aktuellen Live-Mikrofoneingangs ohne Aufzeichnung abrufen?

Jede Hilfe ist dankbar, danke.

16
Tom

Ja, Sie müssen zuerst recorder.start () aufrufen, und Sie dürfen am Ende auch recorder.stop () aufrufen!

Unter http://code.google.com/p/Android-labs/source/browse/trunk/NoiseAlert/src/com/google/Android/noisealert/ - finden Sie eine Beispielanwendung Schauen Sie sich SoundMeter.Java und NoiseAlert.Java an

6
Toumal

Die Lösung von Toumal funktioniert, jedoch konnte ich keine ausreichend hohe Bildwiederholfrequenz für meine Bedürfnisse erzielen. Also habe ich am Ende die SoundMeter.Java Klasse verwendet, die Toumal verlinkt hat, aber modifiziert, um den Code aus dieser answer zu verwenden.

Hier ist der Code, den ich verwendet habe, der eine wesentlich bessere Bildwiederholrate bietet:

import Android.media.AudioFormat;
import Android.media.AudioRecord;
import Android.media.MediaRecorder;

public class SoundMeter {

    private AudioRecord ar = null;
    private int minSize;

    public void start() {
        minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize);
        ar.startRecording();
    }

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

    public double getAmplitude() {
        short[] buffer = new short[minSize];
        ar.read(buffer, 0, minSize);
        int max = 0;
        for (short s : buffer)
        {
            if (Math.abs(s) > max)
            {
                max = Math.abs(s);
            }
        }
        return max;
    }

}
14
Benjamin Kaiser

AudioRecord-Klasse anstelle von MediaRecorder verwenden

Schauen Sie sich diese Seite an: http://www.doepiccoding.com/blog/?p=195 , es gibt eine nette Erklärung und einen Funktionscode :)

2
H. Bharatvaj

Sie können auch die mediaRecoder-Klasse verwenden, um Echtzeitdaten auf der Benutzeroberfläche anzuzeigen, die Sie für die Verwendung von Handler benötigen:

public class SoundMeter {
private MediaRecorder mediaRecorder;
public  void start(){
    if(started){
        return;
    }
    if (mediaRecorder == null){
        mediaRecorder = new MediaRecorder();

        mediaRecorder.setAudioSource(
                MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(
                MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(
                MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setOutputFile("/dev/null");

        try{
            mediaRecorder.prepare();
        }catch (IllegalStateException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        mediaRecorder.start();
        started = true;
    }
}

}
public double getAmplitude(){
    return  mediaRecorder.getMaxAmplitude();
}
}

Dieser Teil zeigt Daten zur Benutzeroberfläche:

    private Runnable pollTask = new Runnable() {
    @Override
    public void run() {
        double amplitude = soundMeter.getAmplitude();
        amplitudeTextView.setText("Amplitude: " + amplitude);

        handler.postDelayed(pollTask, 500);
    }
};

Vergessen Sie nicht, den Handler in der onCreate-Methode aufzurufen:

handler.postDelayed(pollTask, 500);

500 ist eine Verzögerung in Millisekunden, die von der Benutzeroberfläche aktualisiert wird

wie Sie hier sehen können, müssen Sie die Ausgabe nicht in einer Datei speichern, wenn Sie das Ausgabeziel wie folgt festlegen: Es wird nirgendwo gespeichert:

mediaRecorder.setOutputFile("/dev/null");
0
Mohammad Moradi