我正在尝试获取从远程 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对资源一无所知。它需要一些时间来检索元信息,其中包括总持续时间。