iOS/tvOS 17.0更新后AVPlayer出现异常表现
iOS/tvOS 17 AVPlayer 主线程阻塞与播放异常问题处理
问题核心
HTTP(S)视频资源因同步查询未加载属性 assetProperty_MediaPlaybackValidation 导致主线程阻塞,慢速网络下问题更严重;升级至iOS/tvOS 17.0后,iPad/Apple TV上使用AVPlayer时出现视频先2倍速播放后完全停止的异常,即便不在主线程调用play()也无法解决。
可行解决方法
- 改用异步属性查询替代同步调用
避免直接同步访问assetProperty_MediaPlaybackValidation,使用AVAsset的load(_:)方法异步加载该属性,示例代码:let asset = AVURLAsset(url: videoURL) asset.load(.mediaPlaybackValidation) { validationResult, error in if let error = error { // 处理加载错误 return } // 验证通过后再初始化播放器并启动播放 DispatchQueue.main.async { let playerItem = AVPlayerItem(asset: asset) let player = AVPlayer(playerItem: playerItem) player.play() } } - 优化播放器初始化与播放时机
确保AVPlayerItem完全加载后再关联到AVPlayer,监听AVPlayerItem.status属性变化,在状态变为.readyToPlay时触发播放:let playerItem = AVPlayerItem(asset: asset) var statusObserver: NSKeyValueObservation? statusObserver = playerItem.observe(\.status, options: [.new]) { [weak self] item, change in guard let self = self else { return } if item.status == .readyToPlay { self.player.replaceCurrentItem(with: item) self.player.play() statusObserver = nil } else if item.status == .failed { // 处理播放失败逻辑 } } - 禁用系统自动播放速率调整
显式设置AVPlayer的rate属性为1.0,覆盖系统可能的异常速率调整:player.rate = 1.0 - 利用AVPlayerViewController生命周期控制播放
若使用AVPlayerViewController,在viewDidAppear中完成播放器初始化与播放操作,避免提前触发加载逻辑:override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 在此处执行播放器初始化与播放操作 }
内容的提问来源于stack exchange,提问作者iphoneBees
相关产品推荐
相关产品推荐

