AVPlayer监听缩略图添加的事件

4

我有一个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
                }
            }

谢谢

2个回答

4
AVPlayerLayer有一个可以观察的属性:readyForDisplay,它是一个BOOL类型,文档中写道:

布尔值,指示当前关联播放器的项目的第一帧视频是否已准备好显示。使用此属性作为指示器来确定何时最佳显示或动画显示播放器层。在此属性未设置为YES时,可以显示或使播放器层变得可见,但直到该值变为YES,该层才不会有任何用户可见的内容。对于其资产不包含已启用视频轨道的播放器的当前项目,此属性仍保持为NO。该属性可以使用键值观察进行观察。

您应该能够观察此属性,并在视频的第一帧加载后删除加载旋转器。请注意,此属性对于不包含任何视频轨道的播放器项仍然保持为NO。希望这可以帮助您理解。


3

Swift 4代码

下面是监听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")
                    }
                }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接