我正在尝试以 m3u8 格式获取远程视频(通过 http 流式传输)的持续时间。对于某些本地持续时间较长的视频,它无法获取资产的持续时间。我目前正在使用 KVO 来捕获 AVPlayerItem 的 .Ready 状态,然后调用委托方法。
let asset = AVURLAsset(URL: url)
let playerItem = AVPlayerItem(asset: asset!)
let player = AVPlayer(playerItem: playerItem!)
....
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if object as? AVPlayerItem == player?.currentItem {
if keyPath == "status" {
guard let status = player?.currentItem?.status
else { return }
delegate?.videoViewController(self, statusDidChange: status)
}
}
}
但我越来越CMTime(value: 0, timescale: 0, flags: __C.CMTimeFlags(rawValue: 17), epoch: 0)
我还尝试使用loadValuesAsynchronouslyForKeys
方法获取资产的持续时间,但这会返回相同的值。
当调用委托方法时, playerItem.asset.playable 等于 true,但以下所有属性都返回 0:
print(asset?.duration)
print(playerItem?.duration)
print(playerItem?.asset.duration)
print(playerItem?.tracks[0].assetTrack.asset?.duration)