需求场景
监听一段语音音频,音频里有几句话,每句话之间有间隔,要求在间隔之间暂停动画,有讲话时恢复动画。
private Visualizer visualizer;
private boolean isAudioBlankZone = false;
private Visualizer.OnDataCaptureListener dataCaptureListener = new Visualizer.OnDataCaptureListener() {
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {}
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] rawFFT, int samplingRate) {
try {
byte[] fft = new byte[rawFFT.length];
System.arraycopy(rawFFT, 0, fft, 0, rawFFT.length);
Visualizer.MeasurementPeakRms measurement = new Visualizer.MeasurementPeakRms();
visualizer.getMeasurementPeakRms(measurement);
float db = measurement.mRms + 9600;
if (db == 0.0F) {
if (!isAudioBlankZone) {
LogUtils.d(TAG, "audio enter blank zone");
EventBus.getDefault().post(new XXEvent(XXEvent.PAUSE));
}
isAudioBlankZone = true;
} else {
if (isAudioBlankZone) {
EventBus.getDefault().post(new XXEvent(XXEvent.RESUME));
}
isAudioBlankZone = false;
}
LogUtils.d(TAG, "db = " + db);
} catch (Exception e) {
LogUtils.e(TAG, "onFftDataCapture exception: " + e.getMessage());
}
}
};
public void setDataCaptureListener(MediaPlayer mediaPlayer) {
if (mediaPlayer == null) return;
visualizer = new Visualizer(mediaPlayer.getAudioSessionId());
int captureSize = Visualizer.getCaptureSizeRange()[1];
int captureRate = Visualizer.getMaxCaptureRate();
visualizer.setCaptureSize(captureSize);
visualizer.setDataCaptureListener(dataCaptureListener, captureRate / 2, false, true);
visualizer.setScalingMode(Visualizer.SCALING_MODE_NORMALIZED);
visualizer.setMeasurementMode(Visualizer.MEASUREMENT_MODE_PEAK_RMS);
visualizer.setEnabled(true);
}