1. 简介
在android中录制音频有两种方式,MediaRecorder
和AudioRecord
。两者的区别如下:
MediaRecorder
简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放;录制的音频文件是经过压缩的,需要设置编码器;录制的音频文件可以用系统自带的播放器播放。AudioRecord
在声音录制过程中,可以处理采集的声音数据,如降噪、合成等。过程为一段一段进行录制然后得到数据分别进行处理。录制的是PCM格式的音频文件,需要用AudioTrack
来播放,AudioTrack
更接近底层。
添加录音权限
xml
<uses-permission android:name="android.permission.RECORD_AUDIO" />
2. MediaRecorder的使用
MediaRecorder
的使用
kotlin
// 开始录音
fun startRecord(filePath: String) {
mMediaRecorder = MediaRecorder()
try {
// 音频来源,麦克风
mMediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
// 采样率
mMediaRecorder?.setAudioSamplingRate(44100)
// 输出格式
mMediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
// 音频编码
mMediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
// 音质频率
mMediaRecorder?.setAudioEncodingBitRate(96000)
// 输出文件
mMediaRecorder?.setOutputFile(filePath)
mMediaRecorder?.prepare()
mMediaRecorder?.start()
} catch (e: Exception) {
}
}
// 结束录音
fun stopRecord() {
mMediaRecorder?.stop()
mMediaRecorder?.reset()
mMediaRecorder?.release()
mMediaRecorder = null
}
3. MediaRecorder的音量
使用MediaRecorder.getMaxAmplitude
来获取一小段时间内音频源数据中的最大振幅,返回的是0到32767范围的16位整型。
kotlin
//计算分贝
var amplitude = mMediaRecorder?.maxAmplitude ?: 0
var db = 0.0
if (amplitude > 1) {
db = 20 * log10(ratio)
}