Nếu bạn muốn phân tích một mẫu âm thanh lấy trực tiếp từ micro mà không lưu dữ liệu trong một tập tin, bạn cần phải tận dụng các đối tượng AudioRecord như sau:
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);
}
Sau đó, bạn phải bắt đầu ghi âm khi đã sẵn sàng:
audio.startRecording();
Bây giờ là lúc để bắt đầu mẫu đọc như sau:
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));
Mã cuối cùng kết hợp tất cả các biên độ mẫu khác nhau và gán giá trị trung bình cho biến lastLeveL, để biết thêm chi tiết, bạn có thể truy cập vào số post này.
Trân trọng!
Nguồn
2014-01-03 22:10:06
Tôi thích/dev/null, nhưng tôi không hiểu cách lấy MaxAmplitude vài lần mỗi giây. –
Tôi cần liên tục ghi lại mức âm thanh (100 lần mỗi giây). Mức âm thanh được ghi lại (độ lớn) phải từ thời điểm tôi ghi lại. –
Tôi đã giải quyết. Trả về getMaxAmplitude() được giải thích như thế này trên trang web phát triển android: biên độ tuyệt đối tối đa được đo kể từ lần gọi cuối cùng hoặc 0 khi được gọi lần đầu tiên và để nhận bất kỳ giây nào giá trị này tôi đã sử dụng Bộ hẹn giờ. –