AVPlayer 在添加缩略图时监听

AVPlayer listen to when a thumbnail is added

我有一个 AVPlayer 从远程 url 加载内容。创建 AVPlayer 后,它会显示视频的缩略图。我似乎找不到通知或 属性 的任何信息,我可以收听以查看何时添加此缩略图,因为我想在添加缩略图之前显示加载屏幕并在添加缩略图后将其删除。

class VideoView: UIView {
    private var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }

    public var videoURL: URL? {
        didSet {
            guard videoURL != oldValue
                else { return }

            if let videoURL = videoURL {
                avPlayer = AVPlayer(url: videoURL)
                playerLayer.player = avPlayer
            }
        }
    }

    private var avPlayer: AVPlayer?

    override public static var layerClass: AnyClass {
        return AVPlayerLayer.self
    }
}

我曾尝试观察播放器的 currentItem.status 值为 readyToPlay 但缩略图是在状态更改为 readyToPlay

后添加的
observer = currentItem.observe(\.status) { [weak self] (currentItem, change) in
                if currentItem.status == .readyToPlay {
                    self?.overlay?.isHidden = false
                }
            }

谢谢

AVPlayerLayer 有一个 属性 你可以观察到:readyForDisplay。它是 BOOL 并且文档显示为:

A Boolean value that indicates whether the first video frame has been made ready for display for the current item of the associated player. Use this property as an indicator of when best to show or animate-in a player layer into view. A player layer may be displayed, or made visible, while this property is NO, however the layer will not have any user-visible content until the value becomes YES. This property remains NO for a player’s currentItem whose asset contains no enabled video tracks. This property is key value observable using Key-value observing.

您应该能够观察到这一点 属性 并在加载视频的第一帧时移除加载微调器。请注意,对于不包含任何视频轨道的播放器项目,此 属性 仍然 NO。希望这有帮助。

Swift4码

这是在缩略图添加到 AVVideoPlayerViewController 时监听的代码(意味着它已准备好显示)

observer = avVideoPlayerViewController.observe(\.isReadyForDisplay) { [weak self] (avVideoPlayerViewController, change) in
                    if avVideoPlayerViewController.isReadyForDisplay {
                        print("Video player is ready for display")

                    } else {
                        print("Video player is not ready for display")
                    }
                }