Страница 1 из 1

Visualizer и сигнал с микрофона.Проблемка.

Добавлено: 21 май 2013, 14:49
Taras
Здравствуйте.
Столкнулся с проблемой.
Требуется написать приложение, которое будет отображать сигнал с микрофона в виде:
- 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);
	}
Буду благодарен любым полезным советам.