开发录音功能时,在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)
}
})

文本中的代码片段不完全,只挑取了重要的内容,顺序有点问题,不过问题不大
不过WAV格式和PCM格式在录音文件方面看似乎只是多了44个头部字节信息,暂不清楚为什么支持PCM,而不支持WAV。
同时在iOS端,录音结束获取的WAV格式音频,通过lamejs转成mp3格式播放没有声音,但可以监听播放开始和结束的回调。
而在Android端却是正常的。
我手机蓝牙连接的音响设备,没有麦克风,但IOS设备似乎认为我的音响是有麦克风的,导致实际上没有录声音进去,而Android端则可以正确区分,会用手机的麦克风录音,所以一切正常