Моему приложению Android Java необходимо записывать аудиоданные в ОЗУ и обрабатывать их. Вот почему я использую класс «AudioRecord», а не «MediaRecorder» (запись только в файл).
До сих пор я использовал опрос цикла занятости с «read ()» для аудиоданных. до сих пор это работало, но слишком сильно нагружало процессор. Между двумя опросами я усыпил поток, чтобы избежать 100% загрузки ЦП. Однако это не совсем чистое решение, поскольку время сна не гарантируется, и вы должны вычесть время безопасности, чтобы не потерять фрагменты аудио. Это не оптимально для процессора. Мне нужно как можно больше свободных циклов процессора для параллельного потока.
Теперь я реализовал запись с помощью «OnRecordPositionUpdateListener». Это выглядит очень многообещающе, и это правильный способ сделать это в соответствии с SDK Docs. Кажется, все работает (открытие аудиоустройства, чтение () данных и т. д.), но Listner никогда не вызывается.
Кто-нибудь знает, почему?
Информация: я работаю с реальным устройством, а не с эмулятором. Запись с использованием Busy Loop в основном работает (но не удовлетворяет). Никогда не вызывается только прослушиватель обратного вызова.
Вот фрагмент из моего исходного кода:
public class myApplication extends Activity {
/* audio recording */
private static final int AUDIO_SAMPLE_FREQ = 16000;
private static final int AUDIO_BUFFER_BYTESIZE = AUDIO_SAMPLE_FREQ * 2 * 3; // = 3000ms
private static final int AUDIO_BUFFER_SAMPLEREAD_SIZE = AUDIO_SAMPLE_FREQ / 10 * 2; // = 200ms
private short[] mAudioBuffer = null; // audio buffer
private int mSamplesRead; // how many samples are recently read
private AudioRecord mAudioRecorder; // Audio Recorder
...
private OnRecordPositionUpdateListener mRecordListener = new OnRecordPositionUpdateListener() {
public void onPeriodicNotification(AudioRecord recorder) {
mSamplesRead = recorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);
if (mSamplesRead > 0) {
// do something here...
}
}
public void onMarkerReached(AudioRecord recorder) {
Error("What? Hu!? Where am I?");
}
};
...
public void onCreate(Bundle savedInstanceState) {
try {
mAudioRecorder = new AudioRecord(
android.media.MediaRecorder.AudioSource.MIC,
AUDIO_SAMPLE_FREQ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
AUDIO_BUFFER_BYTESIZE);
} catch (Exception e) {
Error("Unable to init audio recording!");
}
mAudioBuffer = new short[AUDIO_BUFFER_SAMPLEREAD_SIZE];
mAudioRecorder.setPositionNotificationPeriod(AUDIO_BUFFER_SAMPLEREAD_SIZE);
mAudioRecorder.setRecordPositionUpdateListener(mRecordListener);
mAudioRecorder.startRecording();
/* test if I can read anything at all... (and yes, this here works!) */
mSamplesRead = mAudioRecorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);
}
}