Столкнулся с проблемой.
Требуется написать приложение, которое будет отображать сигнал с микрофона в виде:
- wave form;
- fft form.
Клас Vizualizer имеет методы getWaveForm() и getFft().
Подписался на Visualizer.OnDataCaptureListener() и по возникновению onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate), или onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate), вызываю метод прорисовки данных.
При этом обьект Vizualizer-a цепляю или по sessionid к MediaPlayer, или слушаю все системные звуки.
Всё прекрсасно работает.
Создаю экземпляр AudioRecord, запускаю запись, запись происходит корректно, звук пишется на карту памяти, но в момент записи методы getWaveForm() и getFft() не вызываются, соответственно нет событий onWaveFormDataCapture() и onFftDataCapture().
Кусок текста программы:
Код: Выделить всё
recorder.startRecording();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recordFile = Environment.getExternalStorageDirectory().getAbsolutePath();
recordFile += "/recorder.arm";
recorder.setOutputFile(recordFile);
setupVisualizerFxAndUI();
mVisualizer.setEnabled(true);
private void setupVisualizerFxAndUI() {
waveVisualizerView = new VisualizerView(this);
waveVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
(int) (VISUALIZER_HEIGHT_DIP * getResources()
.getDisplayMetrics().density)));
WaveLay.addView(waveVisualizerView);
fftVisualizerView = new VisualizerView(this);
fftVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
(int) (VISUALIZER_HEIGHT_DIP * getResources()
.getDisplayMetrics().density)));
FFTLay.addView(fftVisualizerView);
// mVisualizer = new Visualizer(mp.getAudioSessionId());
mVisualizer = new Visualizer(0);
// mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
mVisualizer.setCaptureSize(256);
// mVisualizer.setCaptureSize(bufSize);
mVisualizer.setDataCaptureListener(
new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate) {
waveVisualizerView.updateVisualizer(bytes, false);
}
public void onFftDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate) {
fftVisualizerView.updateVisualizer(bytes, true);
}
}, Visualizer.getMaxCaptureRate() / 2, true, true);
}