Android监听一段长音频里面的空白区域

56 阅读1分钟

需求场景

监听一段语音音频,音频里有几句话,每句话之间有间隔,要求在间隔之间暂停动画,有讲话时恢复动画。


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);
}