这里写目录标题
初始化失败
1.有竞争,需要注意申请完音频焦点看看
2.构建参数错误,主要是缓存区大小
3.如过系统是定制化的,那问题就多了
音频缓冲区设置过大:申请的音频缓冲区超出系统限制。
系统内存紧张:其他应用占用了大量内存,导致连续内存不足。
音频参数不合理:采样率、位深或通道数过高,导致缓冲区需求激增。
记录
AudioRecord 初始化及参数介绍
AudioRecord 是 Android 平台用于从音频输入设备(如麦克风)录制原始音频数据的类。以下是 AudioRecord 的初始化方法及参数详解。
基本初始化
AudioRecord audioRecord = new AudioRecord(
int audioSource,
int sampleRateInHz,
int channelConfig,
int audioFormat,
int bufferSizeInBytes);
参数详解
1. audioSource (音频源)
指定音频输入源,常用值有:
MediaRecorder.AudioSource.MIC
- 麦克风MediaRecorder.AudioSource.VOICE_UPLINK
- 上行通话音频MediaRecorder.AudioSource.VOICE_DOWNLINK
- 下行通话音频MediaRecorder.AudioSource.VOICE_CALL
- 上下行通话音频MediaRecorder.AudioSource.CAMCORDER
- 与摄像头方向相同的麦克风MediaRecorder.AudioSource.VOICE_RECOGNITION
- 语音识别专用
2. sampleRateInHz (采样率)
音频采样频率,单位Hz。常用值:
- 8000Hz - 电话质量
- 11025Hz
- 16000Hz - 语音识别常用
- 22050Hz
- 44100Hz - CD质量
- 48000Hz
注意:不是所有设备都支持所有采样率,可以使用 AudioRecord.getMinBufferSize()
检查是否支持。
3. channelConfig (声道配置)
音频通道配置,常用值:
AudioFormat.CHANNEL_IN_MONO
- 单声道AudioFormat.CHANNEL_IN_STEREO
- 立体声AudioFormat.CHANNEL_IN_FRONT
- 前置麦克风AudioFormat.CHANNEL_IN_BACK
- 后置麦克风
4. audioFormat (音频格式)
音频数据格式,常用值:
AudioFormat.ENCODING_PCM_8BIT
- 8位PCM,每个样本1字节AudioFormat.ENCODING_PCM_16BIT
- 16位PCM,每个样本2字节(最常用)AudioFormat.ENCODING_PCM_FLOAT
- 浮点PCM,每个样本4字节
5. bufferSizeInBytes (缓冲区大小)
音频录制缓冲区大小(以字节为单位)。可以通过 AudioRecord.getMinBufferSize()
获取最小缓冲区大小:
int minBufferSize = AudioRecord.getMinBufferSize(
sampleRateInHz,
channelConfig,
audioFormat);
通常设置为最小缓冲区大小的2-3倍以获得更好的性能。
完整初始化示例
// 音频参数设置
int audioSource = MediaRecorder.AudioSource.MIC;
int sampleRateInHz = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 获取最小缓冲区大小
int minBufferSize = AudioRecord.getMinBufferSize(
sampleRateInHz,
channelConfig,
audioFormat);
// 设置缓冲区大小为最小值的2倍
int bufferSizeInBytes = minBufferSize * 2;
// 创建AudioRecord实例
AudioRecord audioRecord = new AudioRecord(
audioSource,
sampleRateInHz,
channelConfig,
audioFormat,
bufferSizeInBytes);
使用注意事项
- 在开始录制前需要检查
audioRecord.getState()
是否为AudioRecord.STATE_INITIALIZED
- 需要申请录音权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
- 使用完毕后需要调用
audioRecord.release()
释放资源 - 在Android 6.0及以上版本需要运行时权限申请
- 音频焦点
- 如果这个东西不好用,看看是不是系统有定制化
AudioRecord 提供了低延迟的音频录制功能,适合需要实时处理音频数据的应用场景。
参考地址
deepseek