Jeśli chcesz analizować próbki dźwięku pobranej bezpośrednio z mikrofonu bez zapisywania danych w pliku, należy skorzystać z obiektu AudioRecord następująco:
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);
}
Wtedy trzeba zacząć nagrywanie gdy gotowe:
audio.startRecording();
teraz nadszedł czas, aby rozpocząć czytanie próbki w następujący sposób:
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));
Ostatni kod łączy wszystkie amplitudy próbek i przypisuje średnią do ostatniej zmiennej LeveL, aby uzyskać więcej szczegółów, można przejść do tej post.
Pozdrawiam!
Podoba mi się/dev/null, ale nie rozumiem, jak uzyskać MaxAmplitude kilka razy na sekundę. –
Potrzebuję ciągłego rejestrowania poziomu dźwięku (100 razy na sekundę). Nagrany poziom dźwięku (głośność) powinien być od momentu, w którym go nagrałem. –
Rozwiązałem. Zwroty getMaxAmplitude() są wyjaśnione w następujący sposób na stronie internetowej poświęconej rozwojowi Androida: maksymalna bezwzględna amplituda zmierzona od ostatniego połączenia, lub 0 po raz pierwszy wywołana, i aby uzyskać dowolną sekundę tę wartość użyłem Timera. –