package com.manna.codec.record; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.SystemClock; import android.util.Log; /** * 音频采集,边采集边转码AAC */ public class AudioCapture { private static final String TAG = "AudioCapture.class"; //默认参数 private static final int AUDIO_SOURCE = MediaRecorder.AudioSource.MIC; private static final int SAMPLE_RATE = 44100; private static final int CHANNEL_CONFIGS = AudioFormat.CHANNEL_IN_STEREO; private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; private int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIGS, AUDIO_FORMAT); private boolean isStartRecord = false; private boolean isStopRecord = false; private boolean isDebug = true; private AudioRecord audioRecord; /** * 采集回调监听 */ private AudioCaptureListener captureListener; /** * 采集子线程 */ private Thread threadCapture; public void start() { start(AUDIO_SOURCE, SAMPLE_RATE, CHANNEL_CONFIGS, AUDIO_FORMAT); } public void start(int audioSource, int sampleRate, int channels, int audioFormat) { if (isStartRecord) { if (isDebug) Log.d(TAG, "音频录制已经开启"); return; } //各厂商实现存在差异 bufferSize = AudioRecord.getMinBufferSize(sampleRate, channels, audioFormat); if (bufferSize == AudioRecord.ERROR_BAD_VALUE) { if (isDebug) Log.d(TAG, "无效参数"); return; } if (isDebug) Log.d(TAG, "bufferSize = ".concat(String.valueOf(bufferSize)).concat("byte")); audioRecord = new AudioRecord(AudioCapture.AUDIO_SOURCE, sampleRate, channels, audioFormat, bufferSize); audioRecord.startRecording(); isStopRecord = false; threadCapture = new Thread(new CaptureRunnable()); threadCapture.start(); isStartRecord = true; if (isDebug) { Log.d(TAG, "音频录制开启..."); } } public void stop() { if (!isStartRecord) { return; } isStopRecord=true; threadCapture.interrupt(); audioRecord.stop(); audioRecord.release(); isStartRecord=false; captureListener=null; } /** * 子线程读取采集到的数据 */ private class CaptureRunnable implements Runnable { @Override public void run() { while (!isStopRecord) { byte[] buffer = new byte[bufferSize]; int readRecord = audioRecord.read(buffer, 0, bufferSize); if (readRecord > 0) { if (captureListener != null) captureListener.onCaptureListener(buffer,readRecord); if (isDebug) { Log.d(TAG, "音频采集数据源 -- ".concat(String.valueOf(readRecord)).concat(" -- bytes")); } } else { if (isDebug) Log.d(TAG, "录音采集异常"); } //延迟写入 SystemClock -- Android专用 SystemClock.sleep(10); } } } public interface AudioCaptureListener { /** * 音频采集回调数据源 * * @param audioSource :音频采集回调数据源 * @param audioReadSize :每次读取数据的大小 */ void onCaptureListener(byte[] audioSource,int audioReadSize); } public AudioCaptureListener getCaptureListener() { return captureListener; } public void setCaptureListener(AudioCaptureListener captureListener) { this.captureListener = captureListener; } }