问题描述:AVPlayer在从返回流式响应正文的API调用时不会返回正确的资源持续时间值。
解决方法:
let playerItem = AVPlayerItem(url: yourStreamingURL)
playerItem.addObserver(self, forKeyPath: "duration", options: [.new, .initial], context: nil)
let player = AVPlayer(playerItem: playerItem)
player.play()
然后,实现KVO观察者方法来处理观察到的更改:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "duration" {
if let playerItem = object as? AVPlayerItem {
let duration = playerItem.duration.seconds
print("资源持续时间: \(duration)")
// 在这里进行其他处理
}
}
}
let playerItem = AVPlayerItem(url: yourStreamingURL)
let player = AVPlayer(playerItem: playerItem)
player.play()
let interval = CMTime(seconds: 1.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) { [weak self] time in
guard let self = self else { return }
let currentTime = time.seconds
let duration = playerItem.duration.seconds
print("当前时间: \(currentTime), 资源持续时间: \(duration)")
// 在这里进行其他处理
}
这样,您将在每秒钟收到一个时间更新,并可以访问正确的资源持续时间值。
请注意,这些解决方法是基于AVPlayer和AVPlayerItem的使用,可以根据您的具体需求进行调整。