AVPlayerItem的duration属性是一个计算属性,表示当前项目的持续时间。为了保证duration属性正确,需要等待项目的基础媒体数据准备完毕,否则duration将返回0。解决方案是在使用duration属性前,先确保项目的基础媒体数据已经准备完毕。
以下是一个使用AVPlayer和AVPlayerItem的示例代码:
let url = URL(string: "http://example.com/video.mp4")
let playerItem = AVPlayerItem(url: url!)
let player = AVPlayer(playerItem: playerItem)
playerItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.new], context: nil)
...
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(AVPlayerItem.status) {
let status: AVPlayerItem.Status
if let statusNumber = change?[.newKey] as? NSNumber {
status = AVPlayerItem.Status(rawValue: statusNumber.intValue)!
} else {
status = .unknown
}
switch status {
case .readyToPlay:
let duration = playerItem.duration
//使用duration属性
case .failed:
//处理错误
case .unknown:
break
}
}
}