-
Notifications
You must be signed in to change notification settings - Fork 2
使用文档
Jun edited this page Dec 19, 2024
·
9 revisions
data class Mp3Option(
// 声音来源:默认麦克风;如果使用VOICE_COMMUNICATION,系统会自动优化录音,但是声音会变小
@Source var audioSource: Int = AudioSource.MIC,
// 声道设置:单双声道,1单声道,2双声道
var audioChannel: Int = 1,
// debug,输出录音过程日志
var isDebug: Boolean = false,
// 最大录制时间毫秒
var mMaxTime: Long = 1800 * 1_000,
// 采样频率越高, 声音越接近原始数据。
var samplingRate: Int = 48000,
// 比特率越高,传送的数据越大,音质越好 ,MP3输出的比特率,影响输出大小和输出音质,同时会影响文件的大小,质量越好文件越大
var mp3BitRate: Int = 64, // 128 /96(高),32(低)
// Lame 质量1-7,Lame的输出质量,1最快
var mp3Quality: Int = 3,
// 无法录音回调(一般是需要权限:录音和存储),会有点不准确
var permissionListener: PermissionListener? = null,
// 回调
var recordListener: RecordListener? = null,
// pcm 回调
var pcmListener: PCMListener? = null,
// 是否添加AudioEffect, (NoiseSuppressor,AcousticEchoCanceler,AutomaticGainControl)
var enableAudioEffect:Boolean = false
)
mRecorder = recorder {
mMaxTime = 5 * 60 * 1000
isDebug = true
samplingRate = 48000
audioSource = MediaRecorder.AudioSource.MIC
audioChannel = 1
mp3BitRate = 128
mp3Quality = 5
enableAudioEffect = true
recordListener = this@RecordUtils
permissionListener = this@RecordUtils
pcmListener = this@RecordUtils
}.build()
when {
mRecorder?.state == RecordState.STOPPED -> {
if (EmptyUtils.isEmpty(file)) {
val mRecordFile = SDCardUtils.getPath("record") + "/" + System.currentTimeMillis() + ".mp3"
this.saveFile = mRecordFile
}else{
this.saveFile = file
}
mRecorder?.setOutputFile(saveFile,isContinue)
mRecorder?.start()
}
mRecorder?.state == RecordState.PAUSED->{
mRecorder?.onResume()
}
mRecorder?.state == RecordState.RECORDING ->{
mRecorder?.onPause()
}
}
mRecorder?.pause() //暂停
mRecorder?.resume() //重新开始
mRecorder?.state //获取当前录音的状态 3个状态,停止,录音中,暂停
mRecorder?.muteRecord(mute)//静音录制
mRecorder?.setBackgroundMusic(musicUrl)//设置背景音乐
mRecorder?.setBGMVolume(volume)//设置背景音乐大小0-1
mRecorder?.startPlayMusic() //开始播放背景音乐
mRecorder?.pauseMusic() //暂停背景音乐
mRecorder?.isPauseMusic()// 背景音乐是否暂停
mRecorder?.resumeMusic() //重新开始播放
mRecorder?.cleanBackgroundMusic() //移除背景应用相关
mRecorder?.setContextToPlugConfig(context) //设置次方法后,会使用耳机配置方式,只有 【MixRecorder】 有效
mRecorder?.setContextToVolumeConfig(context) //设置方法后,将会使用系统的播放的音量进行控制
> 如果使用耳机配置方式:如果没有连接耳机会只用外放的背景音乐,如果连接上了耳机,会使用写入合成背景音乐的方式
> 如果没有使用耳机配置方式:会同时使用外放和写入背景音乐 2 种方法,可能会存在叠音,目前有细微优化,但是不保证兼容所有机型
mRecorder?.complete() //完成录音,回调接口onSuccess()
//初始Lame录音输出质量
mRecorder?.setMp3Quality(mp3Quality)
//设置比特率,关系声音的质量
mRecorder?.setMp3BitRate(mp3BitRate)
//设置采样率
mRecorder?.setSamplingRate(rate)
//设置音频声道数量,每次录音只能设置一次,如果有背景音乐建议配合背景音乐使用
mRecorder?. setAudioChannel(channel: Int = 1):Boolean
//设置音频来源,每次录音只能设置一次
mRecorder?.setAudioSource(audioSource: Int = MediaRecorder.AudioSource.MIC):Boolean
mixRecorder.reset() //会回调 onReset()
mRecorder?.destroy()//结束录音,不会有任何回调
实现PCMListener
override fun onBeforePCMToMp3(pcm: ShortArray): ShortArray {
val pcmdb = LameUtils.getPCMDB(pcm, pcm.size)
Log.d("LameUtils","修改PCM前DB:$pcmdb" )
val adjustVoice = BytesTransUtil.adjustVoice(pcm, 3)
val afterdb = LameUtils.getPCMDB(adjustVoice, adjustVoice.size)
Log.d("LameUtils","修改PCM后DB:$afterdb" )
return adjustVoice
}
mRecorder.setPCMListener(pcmListener)
经过一些修改得到:
- 说话时,55-70
- 环境声音:20-50
音频文件大小的计算公式为: 数据量Byte = 采样频率Hz×(采样位数/8)× 声道数 × 时间s
反之:时间s = 数据量Byte / (采样频率Hz×(采样位数/8)× 声道数)