AVPlayer在添加缩略图时进行侦听

时间:2018-01-17 16:41:38

标签: ios swift avfoundation avplayer

我有一个AVPlayer从远程网址加载其内容。创建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 个答案:

答案 0 :(得分:2)

Swift 4 Code

以下是将缩略图添加到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")
                    }
                }

答案 1 :(得分:1)

AVPlayerLayer有一个您可以观察到的属性:readyForDisplay。它是BOOL,文档为:

  

一个布尔值,指示第一个视频帧是否已准备好显示相关播放器的当前项目。使用此属性作为最佳显示或动画播放器层进入视图的指示器。当此属性为NO时,可以显示或使其可见,但是在该值变为YES之前,该层将不具有任何用户可见内容。对于其资产不包含已启用的视频轨道的玩家的currentItem,此属性保持为NO。此属性是使用键值观察可观察的键值。

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