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

3

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

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

请查看此链接 https://dev59.com/NWIk5IYBdhLWcg3wrv64#19059484 - Cloy
3个回答

2

AvPlayer在播放远程mp3时总是返回Nan,您需要在模型中附加持续时间并在服务器上硬编码其持续时间。


2

对于VOD内容,您可以使用以下代码获取其时长:

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

当HLS直播时,如果是NAN,则可以通过以下方式访问直播点:

guard let item = player.currentItem else {
    return
}

let seekableDuration = item.seekableTimeRanges.last?.timeRangeValue.end.seconds ?? 0.0

注意:随着时间的推移,实时点会发生变化。

1
你应该为远程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对该资源一无所知。 它需要一些时间来检索元数据,其中包括总持续时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接