Lautsärkemessung mittels internen Mic

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von J4M350N, 12.02.2011.

  1. J4M350N, 12.02.2011 #1
    J4M350N

    J4M350N Threadstarter Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    01.02.2011
    Hallo, arbeite gerade an einer App, die die Umgebungslautstärke kontinuierlich über das interne Mikrofon des Androiden misst und (erstmal) anzeigt.

    Ich möchte noch kurz sagen, dass ich bevor ich mich um die UI-Entwicklung kümmern will, zuerst die Funktion sicherstellen will.

    Kurz zur UI: (Pre-Version)

    • EditText (für Debugging Zwecke)
    • Buttons für Init und Record (Aufruf der Methoden, siehe unten)
    • Seekbar zur Anzeige (der Lautstärke)
    Programmablauf (derzeit):

    1. Start, UI-Elemente "holen"
    2. Initialisierungs-Methode aufrufen (Button)
    3. Record-Methode aufrufen (Button)

    Zuerst die globalen variablen:
    Code:
    private final int myAUDIO_SAMPLE_RATE = 44100;
    private final int myAUDIORECORD_CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
    private final int myAUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
        
    private final int myAUDIORECORD_BUFFERSIZE = AudioRecord.getMinBufferSize(    myAUDIO_SAMPLE_RATE,
                                                                                  myAUDIORECORD_CHANNEL_CONFIG,
                                                                                  myAUDIO_FORMAT);
        
    private AudioRecord myAudioRecord;
    private byte[] myAudioBuffer;
    Initialisierung
    Code:
    private void doInit(){
    
    myAudioRecord = new AudioRecord(    MediaRecorder.AudioSource.MIC,
                                                myAUDIO_SAMPLE_RATE,
                                                myAUDIORECORD_CHANNEL_CONFIG,
                                                myAUDIO_FORMAT,
                                                myAUDIORECORD_BUFFERSIZE);
            
    if(myAudioRecord.getState() == AudioRecord.STATE_INITIALIZED){myEditText.append("AudioRecord initialized.\n");}
    else{myEditText.append("AudioRecord not initialized.\n");}
            
    myEditText.append("AudioRecord Buffersize: " + String.valueOf(myAUDIORECORD_BUFFERSIZE) + "\n");
    }
    
    Ich bekomme hier auf aufs EditText folgendes
    Die Initialisierung scheint also zu klappen.
    Jetz kommt das Problem.

    Code:
    private byte[] doRecord(int duration){
            
    int myAudioRecordBufferSize = myAUDIO_SAMPLE_RATE * 2 * duration;
    // 44100Hz * 2 bytes (16bit pcm) * duration (seconds)
            
    byte[] myAudioRecordBuffer = new byte[myAudioRecordBufferSize];
    int ret1 = 0; // return value
            
    try {ret1 = myAudioRecord.read(myAudioRecordBuffer, 0, myAudioRecordBufferSize);}
    catch (Exception e) {myEditText.append("Exception\n");}
            
    if(ret1 == myAudioRecord.ERROR_INVALID_OPERATION){myEditText.append("Error: Invalid operation.\n");}
    if(ret1 == myAudioRecord.ERROR_BAD_VALUE){myEditText.append("Error: Bad value.\n");}
    if(ret1 == myAudioRecord.ERROR){myEditText.append("Error.\n");}
    
    myEditText.append("Read Bytes: " + String.valueOf(ret1) + "\n");
            
    myEditText.append("Capture started.\n");
    
    while(myAudioRecord.getRecordingState() == myAudioRecord.RECORDSTATE_RECORDING){}
            
    myEditText.append("Capture completed.\n");
    
    Das einlesen funktioniert nicht, ich bekomme:
    Zur Erklärung:
    ret1 im Code ist der Return-Wert der beim Aufruf von myAudioRecord.read(...) zurückgegeben wird. Dieser sollte die Anzahl der eingelesenen Bytes enthalten.
    Auch auffällig ist, dass das Ausführen der Mehorde doRecord nur sehr kurz dauert, auch wenn duration (Aufnahmedauer) ein paar Sekunden beträgt.
    Wenn ich das Byte-Array auslese bzw. die Summe aller elemente bilde kommt 0 raus.

    Ich bin für Vorschläge aller Art dankbar. :thumbsup:
     
    Zuletzt bearbeitet: 13.02.2011

Diese Seite empfehlen