android平台上录制音频主要有两种方式,MediaRecorder、AudioRecord。MediaRecorder 封装的层次比较高,可以直接将手机麦克风录入的音频数据进行编码压缩并存储,生成如AMR、MP3等音频文件。
AudioRecord 接近底层,录制的数据是PCM格式的原始音频裸数据,可以对其做进一步的算法处理、编码压缩等应用,能够自由进行开发控制。
音频开发应用场景很多,仅仅录制保存满足不了大部分实际需求,所以,掌握 AudioRecord 的使用是必须的,本文针对AudioRecord的使用进行总结。
AudioRecord 的使用主要有以下几个步骤:初始化AudioRecord
初始化音频数据buffer
开启采集
启动新线程,从音频数据buffer中读取音频数据
停止采集、释放资源
初始化AudioRecordpublic AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)audioSource:音频源,在类 MediaRecorder.AudioSource 中以常量的形式定义,常用的有DEFAULT(默认),VOICE_RECOGNITION(用于语音识别,等同于DEFAULT),MIC(由手机麦克风输入),VOICE_COMMUNICATION(用于VoIP应用)等。
sampleRateInHz:音频采样率,目前44100Hz是唯一可以保证兼容所有Android手机的采样率。
channelConfig:音频通道数,在类AudioFormat中以常量的形式定义,常用的是 CHANNEL_IN_MONO(单通道),CHANNEL_IN_STEREO(双通道),注意,前者能够兼容所有android手机。
audioFormat:音频数据位宽(量化精度),在类AudioFormat中以常量的形式定义,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保证兼容所有Android手机。
bufferSizeInBytes:AudioRecord内部音频缓冲区大小,不能低于一帧音频的大小,而一帧音频的大小(int size = 采样率 x 位宽 x 采样时间 x 通道数)与音频采样时间有关,一般取 2.5ms~120ms 之间,不同厂商取值不同,所以AudioRecord类提供了 int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) 函数来获取改值,实际开发中,强烈建议由该函数计算出需要传入的 bufferSizeInBytes,而不是自己手动计算。虽然不同的厂商的底层实现是不一样的,但无外乎就是根据上面的计算公式得到一帧的大小,音频缓冲区的大小则必须是一帧大小的2~N倍。
初始化音频数据buffer
通过前面获取的 bufferSizeInBytes ,初始化读取音频数据的buffer。fi