您可以使用AVPlayer的KVO观察loadedTimeRanges属性来判断第一帧视频是否加载完成。当loadedTimeRanges属性的count大于0时,表示已经加载到了某个时间范围内的视频数据。
以下是使用AVPlayer加载第一帧视频前加载gif的示例代码:
import AVFoundation
import UIKit
class ViewController: UIViewController {
var player: AVPlayer!
var playerLayer: AVPlayerLayer!
override func viewDidLoad() {
super.viewDidLoad()
// 创建AVPlayer对象
let videoURL = URL(string: "your_video_url")
player = AVPlayer(url: videoURL!)
// 创建AVPlayerLayer对象
playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
// 监听loadedTimeRanges属性的变化
player.currentItem?.addObserver(self, forKeyPath: "loadedTimeRanges", options: .new, context: nil)
// 播放视频
player.play()
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "loadedTimeRanges" {
if let timeRanges = player.currentItem?.loadedTimeRanges, let timeRange = timeRanges.first as? CMTimeRange {
// 获取已加载的时间范围
let loadedTime = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration)
if loadedTime > 0 {
// 第一帧视频加载完成,可以停止加载gif
stopLoadingGif()
}
}
}
}
func stopLoadingGif() {
// 在这里停止加载gif的操作
}
deinit {
// 移除监听
player.currentItem?.removeObserver(self, forKeyPath: "loadedTimeRanges")
}
}
在上述代码中,我们创建了一个AVPlayer对象并将其嵌入到AVPlayerLayer中。然后,我们使用KVO监听loadedTimeRanges属性的变化。当loadedTimeRanges属性的count大于0时,表示第一帧视频加载完成,我们可以停止加载gif的操作。
请注意,您需要将your_video_url替换为您自己的视频URL。另外,记得在适当的时候停止加载gif的操作,您可以在stopLoadingGif方法中实现相应的逻辑。最后,为了防止内存泄漏,在视图控制器销毁时,需要移除对loadedTimeRanges属性的观察。