React Native Expo Audio iOS端无法播放报AVFoundationErrorDomain -11850求助
可行解决思路
方案1:调整URL结构增加伪后缀(优先推荐)
iOS的AVPlayer识别媒体格式时会优先读取URL后缀,你可以和后端配合调整路由规则:
- 把原请求路径从
${api}/api/v1/voicemail?s3_email_id=${s3_email_id}改为${api}/api/v1/voicemail/${s3_email_id}.wav - 后端调整路由匹配规则,忽略
.wav后缀,直接提取路径中的s3_email_id参数执行业务逻辑即可,原有返回内容不需要做任何修改
该方案改造成本最低,同时完全兼容原有Android、Web端的逻辑,不需要修改其他端的代码。
方案2:主动指定媒体格式
如果不方便调整后端路由,可以在构造播放源时主动声明媒体类型,提示AVPlayer不要依赖URL后缀判断格式:
const source = { uri: url, // 明确告知播放器资源为wav格式 type: 'wav', headers: { // 主动声明期望接收的媒体类型,确保服务端返回正确的Content-Type 'Accept': 'audio/wav' } }
你用的expo-audio库底层会把type参数透传给AVPlayer,大部分场景下可以解决格式识别失败的问题。
方案3:本地缓存后播放
如果上述两个方案都无法落地,可以先把音频文件下载到本地缓存,重命名带后缀后再播放,适合语音留言这类体积较小的音频资源:
import * as FileSystem from 'expo-file-system'; // 调用示例 const loadNewPlaybackInstance = async playing => { const cacheUri = `${FileSystem.cacheDirectory}${s3_email_id}.wav`; // 先下载到本地缓存 const downloadResult = await FileSystem.downloadAsync(url, cacheUri); const source = { uri: downloadResult.uri } // 后续原有播放逻辑不变 ... }
该方案完全绕过了URL后缀识别的问题,就是多了一步下载缓存的开销,对于短音频来说感知不明显。
问题根因说明
Android和Web端的媒体播放器会优先读取响应头的Content-Type字段判断媒体格式,而iOS的AVPlayer默认会优先校验URL后缀,如果后缀不匹配,就算服务端返回了正确的Content-Type: audio/wav也可能出现格式识别失败的问题,就是你遇到的-11850错误。
内容的提问来源于stack exchange,提问作者Loquen
相关产品推荐
相关产品推荐

