iOS导航栈VC切换后AVPlayerLayer空白且无声音问题求助
AVPlayerLayer偶发空白无播放的排查思路
1. 底层音视频资源泄漏排查
这类现象大概率是未体现在内存图中的系统硬解码资源超限导致,刚好匹配不同设备复现次数不同的特征(初代SE的硬解码并发句柄上限远低于iPhone 11)
- 确认播放器VC的
viewWillDisappear:/dealloc方法中,主动执行以下资源释放逻辑:// 释放当前播放项 [self.player replaceCurrentItemWithPlayerItem:nil]; // 断开player与layer的绑定 self.playerLayer.player = nil; // 置空player对象 self.player = nil; - 禁止在播放器VC销毁时依赖系统自动释放资源,音视频硬解码资源属于系统全局共享资源,占用超限后新的播放器实例无法拿到解码权限,就会出现所有播放方法无响应的现象
2. 播放状态异常监听补全
- 给
AVPlayer的status属性、AVPlayerItem的status属性新增KVO监听,异常触发时打印以下字段的具体值:player.status、player.errorplayer.currentItem.status、player.currentItem.error
- 注册系统通知监听:
AVPlayerItemFailedToPlayToEndTimeNotification、AVPlayerItemPlaybackStalledNotification,异常发生时确认是否有系统层面的播放错误回调抛出
3. 调用线程合法性检查
- 所有
AVPlayer、AVPlayerLayer的操作必须在主线程执行,子线程操作音视频UI相关对象会出现偶发无响应、渲染失效的问题,且不会触发明显崩溃 - 确认
play()调用时机必须晚于AVPlayerItemStatusReadyToPlay状态回调,提前调用会出现偶发播放失效
4. 相机与播放器资源抢占排查
- 自定义相机VC跳转前必须主动停止
AVCaptureSession,且确认session完全停止后再执行跳转逻辑,相机的音视频采集占用的硬件资源和播放器的解码资源会出现抢占,低性能设备上表现更明显 - 跳转播放器前可主动调用
AVCaptureSession的removeInput:/removeOutput:释放采集资源,减少硬件资源占用冲突
5. 快速定位验证方案
异常复现时直接生成新的AVPlayer、AVPlayerItem实例赋值给原有AVPlayerLayer,如果可以恢复播放即可确定是原有player对象底层失效导致,可临时新增降级逻辑:监听到player状态异常时自动重建播放器实例。
内容的提问来源于stack exchange,提问作者Михаил Нечаев
相关产品推荐
相关产品推荐

