收藏
回答

RecorderManager.onFrameRecorded在iOS端监听WAV格式回调不生效?

开发录音功能时,在Android端使用WAV格式录音,然后获取帧回调,以此用来计算一些实时数据,但在iOS端却发现实时计算未生效,排查后发现是微信的RecorderManager.onFrameRecorded(function listener)方法并没有触发回调,而修改为mp3格式后,回调又能正常执行了。但mp3格式的帧回调无法让我计算一些数据,如当前录音帧的分贝大小等

IOS真机版本:18.5

Android真机版本:15

  data: {
    // 录音参数
    options: {
      // 录音的时长 1min
      duration: 60 * 1000,
      // 采样率 22050  24000
      sampleRate: 12000,
      // 录音通道数
      numberOfChannels: 1,
      // 编码码率  39000  40000
      encodeBitRate: 64000,
      // 音频格式 wav PCM pcm格式似乎无法被audioCtx播放 但mp3格式可以被播放
      // 如果使用wav,可以不处理直接播放,如果使用pcm,则要先处理成mp3,才能播放
      // wav文件比pcm文件大一点
      format: 'wav',
      // 指定帧大小回调 KB
      frameSize: 1.5
    },
    }
let recorderManager = wx.getRecorderManager()
recorderManager.start(this.data.options)
// 监听已录制完指定帧大小的文件事件
recorderManager.onFrameRecorded((res) => {
  const { frameBuffer } = res
  console.log('录音指定帧 frameBuffer', frameBuffer, frameBuffer.byteLength)
  if (res.frameBuffer && res.frameBuffer.byteLength) {
    console.warn('指定帧回调,计算volume')
    // 自定义RMS计算
    const volume = calculateVolume(res.frameBuffer)
    console.log('volume:', volume)
    this.data.waveData.push(volume.toFixed(2))
    // 更新数据
    this.setData({
      waveData: this.data.waveData
    })
    // console.log('自定义计算:', volume)
  }
})

回答关注问题邀请回答
收藏

1 个回答

  • yicuin
    yicuin
    07-17

    文本中的代码片段不完全,只挑取了重要的内容,顺序有点问题,不过问题不大

    07-17
    有用
    回复 6
    • yicuin
      yicuin
      07-18
      又看了一下官方文档,有明确说目前只支持pcm和mp3的格式回调,WAV目前应该是不支持的。
      不过WAV格式和PCM格式在录音文件方面看似乎只是多了44个头部字节信息,暂不清楚为什么支持PCM,而不支持WAV。
      同时在iOS端,录音结束获取的WAV格式音频,通过lamejs转成mp3格式播放没有声音,但可以监听播放开始和结束的回调。
      而在Android端却是正常的。
      07-18
      回复
    • yicuin
      yicuin
      07-18回复yicuin
      没声音的原因也找到了:
      我手机蓝牙连接的音响设备,没有麦克风,但IOS设备似乎认为我的音响是有麦克风的,导致实际上没有录声音进去,而Android端则可以正确区分,会用手机的麦克风录音,所以一切正常
      07-18
      回复
    • yicuin
      yicuin
      07-24
      还有不太明白的是Android端可以拿到WAV的回调,但IOS却不行,虽然文档说了目前只支持PCM和MP3
      07-24
      回复
    • 。
      08-05
      兄弟,解决了吗?我也碰到了这个问题
      08-05
      回复
    • 。
      08-05回复yicuin
      对啊,安卓可以,ios死活不行
      08-05
      回复
    查看更多(1)
登录 后发表内容