Lautsärkemessung mittels internen Mic

J

J4M350N

Neues Mitglied
0
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
AudioRecord initialized.
AudioRecord Buffersize: 3017
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:

Ähnliche Themen

Y
Antworten
4
Aufrufe
1.211
swa00
swa00
E
Antworten
1
Aufrufe
805
enrem
E
E
Antworten
1
Aufrufe
820
enrem
E
Zurück
Oben Unten