Expo AV iOS设备RecordingStatus中durationMillis始终为0问题求助
iOS真机录音
durationMillis始终为0的排查方案 问题场景
- 仅iOS真机出现异常,iOS模拟器、安卓全平台(真机/模拟器)运行正常
- 使用Expo Audio模块创建录音时,传入的状态回调中
durationMillis字段始终为0,即使isRecording已切换为true - 该功能此前在iOS真机上正常运行,突然失效;已尝试卸载重装应用、分别使用Expo Go/TestFlight构建版本测试,问题未解决
相关代码与日志
创建录音代码
await Audio.Recording.createAsync( {...Audio.RecordingOptionsPresets.HIGH_QUALITY}, statusUpdateCallback, );
状态回调函数
const statusUpdateCallback = async (status: Audio.RecordingStatus) => { console.log(status); };
iOS真机日志输出
LOG {"canRecord": true, "durationMillis": 0, "isRecording": false, "mediaServicesDidReset": false, "metering": -120} LOG {"canRecord": true, "durationMillis": 0, "isRecording": false, "mediaServicesDidReset": false, "metering": -120} LOG {"canRecord": true, "durationMillis": 0, "isRecording": true, "mediaServicesDidReset": false, "metering": -28.657485961914062} LOG {"canRecord": true, "durationMillis": 0, "isRecording": true, "mediaServicesDidReset": false, "metering": -24.778385162353516}
排查思路
- 校验
expo-av版本兼容性:确认当前使用的expo-av版本是否存在iOS真机时长统计bug,直接升级到最新稳定版,或回退至之前能正常运行的版本 - 替换预设配置为自定义参数:
Audio.RecordingOptionsPresets.HIGH_QUALITY可能在iOS真机上存在配置缺失,手动指定完整录音参数,示例:const customOptions = { sampleRate: 44100, numberOfChannels: 1, format: Audio.RECORDING_OPTION_IOS_FORMAT_M4A, bitRate: 128000, audioQuality: Audio.RECORDING_OPTION_IOS_AUDIO_QUALITY_HIGH }; await Audio.Recording.createAsync(customOptions, statusUpdateCallback); - 重新验证iOS权限与隐私配置:检查APP的麦克风权限是否为“允许”,同时确认
Info.plist中已正确配置NSMicrophoneUsageDescription字段(即使之前配置过,系统更新可能导致权限重置) - 排查系统音频服务异常:iOS媒体服务偶尔会出现异常,尝试重启设备;同时在APP中监听
mediaServicesDidReset状态,触发时重新初始化录音模块 - 绕过回调状态,主动获取时长:暂时不依赖回调中的
durationMillis,在录音过程中定时调用getDurationAsync()获取真实时长,验证是否为回调状态统计问题:// 录音过程中定时执行 const fetchRealDuration = async () => { const realDuration = await recordingInstance.getDurationAsync(); console.log('真实录音时长:', realDuration); }; - 确认iOS系统版本影响:测试不同iOS版本的真机,排查是否为特定系统版本(如iOS 17.x)引入的兼容性问题
内容的提问来源于stack exchange,提问作者cip123
相关产品推荐
相关产品推荐

