当网络连接不良且 AVPlayer 正在播放时应用程序挂起

Asi*_*sif 0 objective-c ios avplayer swift avplayeritem

我正在开发一个 iOS 无线电应用程序。当网络连接良好时,应用程序运行正常。

我的情况略有不同。我限制了 iPhone 中的移动数据速度(设置 -> 开发人员 -> 网络链接调节器),并从列表中选择了较差的网络选项。此时,播放器正在尝试流式传输音频内容,如果我尝试呈现或关闭视图控制器,则应用程序会变慢或挂起。我尝试从主队列中呈现视图控制器,但这不起作用。

   let requestedKey = ["playable","duration"]
            asset.loadValuesAsynchronously(forKeys: requestedKey) {
                DispatchQueue.main.async{
                    var error: NSError?
                    let keyStatus = asset.statusOfValue(forKey: "playable", error: &error)
                    if keyStatus == AVKeyValueStatus.failed || !asset.isPlayable {
                        completionHandler(false, nil)
                        return
                    }
                    completionHandler(true, asset)
                }
            }

if player == nil {
            player = AVPlayer()

        }
        playerItem = AVPlayerItem(asset: asset)
Run Code Online (Sandbox Code Playgroud)

这就是我设置播放器的方式。当连接较差或边缘时,请帮助我解决这个严重的性能问题。

rap*_*ael 5

使用 AVPlayer 时,需要做很多事情来管理不良的网络连接并恢复播放。

但这与线程管理无关。

AVPlayerItem失败时:AVPlayerItem.Status== .failed,您必须初始化一个新AVPlayerItem对象并注入到 AVPlayer 中。您可以使用replaceCurrentItem(with:)AVPlayer方法。

此外,要检测任何播放失败的情况,您可以观察以下通知:

  • AVPlayerItemPlaybackStalled
  • AVPlayerItemDidPlayToEndTime(当缓冲区为空网络输出时也会触发)
  • AVPlayerItemFailedToPlayToEndTime

您可以检查[ModernAVPlayer][1]库,特别是 PlayingState.swift 文件来了解该过程。