My Android Java Application необходимо записывать аудиоданные в ОЗУ и обрабатывать их. Вот почему я использую класс "AudioRecord", а не "MediaRecorder" (записывается только в файл).
До сих пор я использовал опрос занятого цикла с "read()" для аудиоданных. это работает до сих пор, но это слишком сильно перегружает процессор. Между двумя опросами я поставил поток спать, чтобы избежать использования 100% CPU. Однако это не очень чистое решение, так как время сна не гарантируется, и вы должны вычитать время безопасности, чтобы не потерять аудио сниппеты. Это не оптимальный процессор. Мне нужно столько бесплатных циклов процессора, сколько возможно для параллельный поток.
Теперь я выполнил запись, используя "OnRecordPositionUpdateListener". Это выглядит очень многообещающим и правильным способом сделать это согласно SDK Docs. Кажется, что все работает (открытие аудиоустройства, чтение() данных и т.д.) но Listner никогда не называется.
Кто-нибудь знает, почему?
Info: Я работаю с настоящим устройством, а не под эмулятором. Запись с использованием 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);
}
}