Skip to content

使用文档

Jun edited this page Dec 19, 2024 · 9 revisions

Table of Contents

初始化

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
)
创建Recorder
 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()

1.录音控制(开始/暂停)

    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()
          }
      }  

2. 暂停、重新开始录音

 mRecorder?.pause() //暂停
 mRecorder?.resume() //重新开始
 mRecorder?.state     //获取当前录音的状态 3个状态,停止,录音中,暂停

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 种方法,可能会存在叠音,目前有细微优化,但是不保证兼容所有机型

5. 完成录音(停止录音)

 mRecorder?.complete()  //完成录音,回调接口onSuccess()

6.新增录音参数修改,必须在start()之前调用才有效

  //初始Lame录音输出质量
  mRecorder?.setMp3Quality(mp3Quality)
  //设置比特率,关系声音的质量
  mRecorder?.setMp3BitRate(mp3BitRate)
  //设置采样率
  mRecorder?.setSamplingRate(rate)
  //设置音频声道数量,每次录音只能设置一次,如果有背景音乐建议配合背景音乐使用
  mRecorder?. setAudioChannel(channel: Int = 1):Boolean
  //设置音频来源,每次录音只能设置一次
  mRecorder?.setAudioSource(audioSource: Int = MediaRecorder.AudioSource.MIC):Boolean

7.中途直接结束.停止录音

mixRecorder.reset() //会回调 onReset()
mRecorder?.destroy()//结束录音,不会有任何回调

8.pcm转MP3之前的处理

实现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

PCM与时间的计算

音频文件大小的计算公式为: 数据量Byte = 采样频率Hz×(采样位数/8)× 声道数 × 时间s

反之:时间s = 数据量Byte / (采样频率Hz×(采样位数/8)× 声道数)

使用案例