一个 AVPlayerItem 一次只能占据玩家队列中的一个位置?

An AVPlayerItem can occupy only one position in a player's queue at a time?

我已经看到 many questions 并且 none 有解决方案。我得到:

An AVPlayerItem can occupy only one position in a player's queue at a time

在控制台中快速点击一个应具有以下两种状态之一的视图按钮后:

  1. 成功预加载视频
  2. 只有一个视频 URL,然后将在另一个 VC 中加载。

为什么会发生这种情况,我该如何解决?

这是我的代码,在过渡到 VC:

if numberMedia == 0 {

            if selectedPost!.interimMedia[numberMedia].playerLayer != nil {
                playCurrentMediaVid(currentMedia: selectedPost!.interimMedia[numberMedia])
            } else {

                let videoURL = selectedPost!.interimMedia[numberMedia].videoURL

                if videoURL != nil {
                    //if we did not preload the video but have the cached vidURL
                    preloadVideo(media: selectedPost!.interimMedia[numberMedia])
                    playCurrentMediaVid(currentMedia: selectedPost!.interimMedia[numberMedia])
                } else {
                    //if we dont have the cached vid url
                    selectedPost!.interimMedia[numberMedia].videoURL = getVideoURL(stringUrl: selectedPost!.interimMedia[numberMedia].videoURLString)
                    preloadVideo(media: selectedPost!.interimMedia[numberMedia])
                    playCurrentMediaVid(currentMedia: selectedPost!.interimMedia[numberMedia])
                }
            }

        }

我调查了这个问题,发现了以下问题:

如果你打印 playerQueue 的 status.rawValue 和 AVPlayerQueue 的 currentItem(AVPlayerItem)(sub-class of AVPlayer),你会发现状态将为 0 或 1。对于参考:0 表示 status.unknown,1 表示 status.readyToPlay(您想要的那个)。因此,如果两次打印都为 0,则失败,这就是您收到错误的原因。该位置未知,但您正在尝试 .play() playerQueue,这当然会导致错误。

我对你的建议(修复)是找到一种方法来加快 AVPlayerItem 中媒体的加载速度(这可以通过将 URL 放入 AVAsset 而不是尝试立即将 URL 初始化为 AVPlayer),或者可以使用 KVO 来检测它何时完成加载(有点像 completionBlock-esque 解决方案)。