Ich habe mich mit der AudioRecord-Funktion der Android-API beschäftigt und einige merkwürdige Verhaltensweisen gefunden.Android AudioRecord Fragen?
Hintergrundinfo: Mein Telefon ist ein HTC Incredible Ich benutze das Eclipse-Plugin für die Android-Entwicklung mit dem Emulator. Gezielte Plattform oder OS ist 2.2 ... Da ist es was mein Handy benutzt.
Einige Code:
bufferSize = AudioRecord.getMinBufferSize(FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
Dies ist der Code, den ich zu Setup verwenden die AudioRecord API mit. Nun, für den Emulator mag es, dass FREQUENCY auf 8000 gesetzt wird, damit es funktioniert. Kommt mit einer Puffergröße von 640 zurück. Für das Telefon verwende ich 44100. Ein Problem hier scheint, dass die resultierenden PCM-Daten für die Welle eine acht Bit signierte Welle zu sein scheinen. Ich bekomme Werte von -127 bis 128. Ich dachte, der Wert AudioFormat.ENCODING_PCM_16BIT
würde etwas anderes produzieren.
I verarbeitet die Audio mit einem Gewinde,
public void run() {
while(isRecording) {
audioRecord.startRecording();
byte[] data = new byte[bufferSize];
audioRecord.read(data, 0, bufferSize);
listener.setData(data);
handleData(data);
}
audioRecord.release();
}
Ich habe eine Art und Weise in Echtzeit grafisch mit Hilfe eines SurfaceView
zu entsprechenden Wellen anzuzeigen. Es scheint eine Menge Lärm vom MIC zu kommen. Ich bekomme dieses Geräusch vom Emulator und vom Telefon. Muss ich die Daten durch einen oder mehrere Filter laufen lassen? Ich würde gerne diese Daten verwenden, um etwas Spaß FFT und Sachen zu berechnen, nur um mit der Welle herumzuspielen. Aber ich muss irgendwie den Lärm reduzieren.
Hat jemand anderes dies auch erlebt. Hat jemand eine Lösung?
schätzte ich Ihre Zeit und Antworten, Dank, dk
Ich habe das Rauschen mit einigen FFT-Techniken reduziert und habe einige Codebeispiele dazu. Ich bin gerade unterwegs, möchte aber die Diskussion fortsetzen, wenn ich zurück bin. Danke für deinen Beitrag. – dakira
intervalFrames ist die Anzahl der Stichproben, für die Sie benachrichtigt werden möchten. Wenn Sie Stichproben bei 8000 durchführen, ruft intervalFrames = 4000 Ihren Benachrichtigungs-Listener alle 1/(8000/4000) = 0,5 Sekunden auf. Sie müssen Ihren Lesevorgang für die Listener-Funktion starten, die aufgerufen werden soll. Außerdem müssen Sie sicherstellen, dass Ihre Lesepuffergröße> = intervalFrames ist. –
+1 für getNativeOutputSampleRate(); Wie hast du dein Problem gelöst? Ich kämpfe auch mit ähnlichen Problemen? http://stackoverflow.com/questions/9413998/live-audio-recording-and-play-in-android – aProgrammer