我们的小程序在服务过程中需要使用 RecorderManager 进行长时间录音,并开启了后台录音能力。当前遇到一个问题:
小程序后台录音中,用户打开相机/选择图片、息屏、接打电话等场景后,录音可能实际停止,但 RecorderManager 没有触发任何可用事件回调,导致业务侧无法及时感知并处理。
目前已监听:
- onStart
- onStop
- onPause
- onError
- onInterruptionBegin
- onInterruptionEnd
- onFrameRecorded
实际现象:
- 录音开始后,onStart 正常触发。
- 正常录音时,onFrameRecorded 正常回调并生成切片。
- 打开相机/选择图片、息屏、接打电话等场景后,录音不再产生 onFrameRecorded,服务端也收不到后续切片。
- 但此时没有触发 onStop、onError、onPause、onInterruptionBegin、onInterruptionEnd。
- 回到小程序后,页面上的计时仍可能继续,但底层录音实际已经停止/没有音频帧。
想请教:
- 这种“底层录音停止但 RecorderManager 没有任何事件回调”的情况是否符合预期?
- 后台录音被相机/选择图片、息屏、来电等场景中断,是否有官方推荐的检测或恢复方式?
- onInterruptionBegin/onInterruptionEnd 是否应该覆盖相机、息屏、来电等导致的录音中断?
- 如果没有任何事件回调,是否只能通过业务侧检测 onFrameRecorded 长时间没有回调来判断录音异常?
- 对于长时间后台录音场景,官方是否有推荐的最佳实践或规避方案?
我们当前只能考虑通过检测长时间没有收到 onFrameRecorded 来提示用户手动继续录音,但这个方案不够可靠,也不确定是否符合官方建议。希望能得到官方确认或推荐处理方式。
1. 完整报错信息
目前没有收到明确报错信息。
我们已监听 RecorderManager 的以下事件:
const recorderManager = wx.getRecorderManager();
recorderManager.onStart(() => {
console.log('recorder onStart');
});
recorderManager.onFrameRecorded((res) => {
console.log('recorder onFrameRecorded', res.frameBuffer?.byteLength, res.isLastFrame);
});
recorderManager.onStop((res) => {
console.log('recorder onStop', res);
});
recorderManager.onPause(() => {
console.log('recorder onPause');
});
recorderManager.onError((err) => {
console.log('recorder onError', err);
});
recorderManager.onInterruptionBegin(() => {
console.log('recorder onInterruptionBegin');
});
recorderManager.onInterruptionEnd(() => {
console.log('recorder onInterruptionEnd');
});
实际问题场景下:
- onStart 正常触发。
- 正常录音时 onFrameRecorded 正常触发。
- 打开相机/选择图片/息屏/来电等场景后,onFrameRecorded 不再触发。
- 没有触发 onStop。
- 没有触发 onError。
- 没有触发 onPause。
- 没有触发 onInterruptionBegin/onInterruptionEnd。
- 因此没有完整错误信息或 errMsg 可提供。
2. 问题触发流程
复现流程如下:
- 小程序开启后台录音能力。
- 页面中通过 wx.getRecorderManager() 获取录音管理器。
- 调用 recorderManager.start() 开始录音。
- 设置 frameSize,通过 onFrameRecorded 接收录音帧并上传切片。
- 录音开始后,onStart 正常触发,onFrameRecorded 正常持续回调。
- 保持录音中,触发以下任一场景:打开相机或选择图片。
- 息屏一段时间。
- 接到电话或进行通话。
- 回到小程序后,发现 onFrameRecorded 不再回调,服务端也收不到后续录音切片。
- 但 onStop/onError/onPause/onInterruptionBegin/onInterruptionEnd 均未触发,业务侧无法判断录音已经停止。
补充说明:
我们想确认的是:在后台长时间录音场景下,如果录音被相机/选择图片/息屏/来电等系统行为中断,但 RecorderManager 没有触发任何事件回调,是否有官方推荐的检测或恢复方式?目前业务侧只能通过“长时间没有收到 onFrameRecorded”来推断录音异常,但这种方式不够可靠。
