android audiorecord

发布于:2025-04-10 ⋅ 阅读:(33) ⋅ 点赞:(0)

初始化失败

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

使用注意事项

  1. 在开始录制前需要检查 audioRecord.getState() 是否为 AudioRecord.STATE_INITIALIZED
  2. 需要申请录音权限 <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  3. 使用完毕后需要调用 audioRecord.release() 释放资源
  4. 在Android 6.0及以上版本需要运行时权限申请
  5. 音频焦点
  6. 如果这个东西不好用,看看是不是系统有定制化

AudioRecord 提供了低延迟的音频录制功能,适合需要实时处理音频数据的应用场景。

参考地址

deepseek


网站公告

今日签到

点亮在社区的每一天
去签到