Android: определение уровня звука
Использование MediaRecorder
Я фиксирую звук с микрофона устройства. Из звука, который я получаю, мне нужно только проанализировать громкость звука (громкость звука), не сохраняя звук в файле.
Два вопроса:
- Как я могу получить громкость звука в данный момент времени?
- Как выполнить анализ без сохранения звука в файл?
Спасибо.
Ответы
Ответ 1
-
Используйте mRecorder.getMaxAmplitude();
-
Для анализа звука без сохранения всего, что вам нужно, используйте mRecorder.setOutputFile("/dev/null");
Вот пример, я надеюсь, что это поможет
public class SoundMeter {
private MediaRecorder mRecorder = null;
public void start() {
if (mRecorder == null) {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
mRecorder.prepare();
mRecorder.start();
}
}
public void stop() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public double getAmplitude() {
if (mRecorder != null)
return mRecorder.getMaxAmplitude();
else
return 0;
}
}
Ответ 2
Если вы хотите проанализировать образец звука, взятый непосредственно из микрофона, не сохраняя данные в файле, вам необходимо использовать объект AudioRecord следующим образом:
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);
}
Затем вы должны начать запись, когда будете готовы:
audio.startRecording();
Теперь приступим к чтению отсчетов следующим образом:
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));
Последний код объединяет все различные амплитуды выборки и присваивает среднее значение переменной lastLeveL, для получения более подробной информации вы можете перейти к этому сообщению .
Привет!
Ответ 3
Я играл с несколькими приложениями с исходным кодом для записи звука, но для его получения потребовалось некоторое время.
Вы можете скопировать исходный код Google NoiseAlert - код SoundMeter, который я использовал.
getMaxAmplitude варьируется от 0 до 32768. Материал EMA, с которым я не стал использовать.
В вашем основном действии вы должны объявить объект MediaRecorder и вызвать его функцию start(), как процитировала Анна.
Для получения дополнительной информации вы можете обратиться к моему проекту:
http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-i-e-how-to-transmit-send-data-from-android-to-arduino-bluesmirf-silver-using-bluetooth/
Где мне нужно было отправить значение амплитуды звука над BlueTooth.
Точный код находится здесь: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin
Просто просканируйте части, имеющие какое-либо отношение к объекту MediaRecorder.