You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:01:00