如何在 Swift 4 中获取 AVPlayer 项目的总持续时间



我正在尝试获取从远程 URL 加载的 mp3 文件的总持续时间,但它返回NAN.我正在使用AVPlayer(不是AVAudioPlayer(。

let duration = CMTimeGetSeconds((self.player?.currentItem?.asset.duration)!)
print(duration)// returns NAN

AvPlayer在播放远程 mp3-s 时将始终返回Nan,您需要在模型中使用 url 附加持续时间,并在服务器中对其持续时间进行硬编码

对于 VOD 内容,您可以使用以下命令获取持续时间:

self.player.currentItem?.duration.seconds ?? 0.0

它是 NAN 当是 HLS 直播时,您可以使用以下方法访问直播点:

guard let item = player.currentItem else {
return
}
let seekableDuration = item.seekableTimeRanges.last?.timeRangeValue.end.seconds ?? 0.0

注意:实时点会随着时间的流逝而变化

您应该为远程 AVPlayerItem 的状态更改设置一个观察者。

self.statusObservation = nil  // remove observer for outdated items
self.statusObservation = self.avPlayer?.currentItem?.observe(AVPlayerItem.status) { [weak self] item, _ in
guard let self = self else { return }
// prevent reading duration from an outdated item:
guard item == self.avPlayer?.currentItem else { return }
if item.status == .readyToPlay {
item.duration.seconds  // the duration you need.
}
}

基本上,当远程AVPlayerItem刚刚被设置时,AVPlayer对资源一无所知。它需要一些时间来检索元信息,其中包括总持续时间。

最新更新