Swift 5 — Как получить продолжительность AVPlayer

#swift #avplayer #nan #ios13

#swift #avplayer #nan #ios13

Вопрос:

Я пытаюсь получить продолжительность звука с помощью AVPlayer [не AVAudioPlayer], но он всегда извлекает NaN.

вот что я делаю:

 let urlString = dataModel.currentPodcast.url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let asset = AVAsset(url: URL.init(string: urlString!)!)
playerItem = AVPlayerItem(asset: asset)
DispatchQueue.main.async {
  player = AVPlayer(playerItem: playerItem)
}

self.epTotalTime.text = self.secondsToFormattedString(player.currentItem.asset.duration)
  

итак, я попытался сделать это:

 durationObserver = playerItem?.observe(AVPlayerItem.status, changeHandler: { observedPlayerItem, change in
  if (observedPlayerItem.status == AVPlayerItem.Status.readyToPlay) {
    self.epTotalTime.text = self.secondsToFormattedString(totalSeconds: CMTimeGetSeconds(observedPlayerItem.asset.duration))
  }
})
  

и здесь TotalSeconds по-прежнему составляет NaN:

 private func secondsToFormattedString(totalSeconds: Float64) -> String {

  guard !(totalSeconds.isNaN || totalSeconds.isInfinite) else {
    return "--:--"
  }
    
  let hours:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 86400) / 3600)
  let minutes:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 3600) / 60)
  let seconds:Int = Int(totalSeconds.truncatingRemainder(dividingBy: 60))

  if hours > 0 {
    return String(format: "%i:i:i", hours, minutes, seconds)
  } else {     
    return String(format: "i:i", minutes, seconds)
  }
}

  

Комментарии:

1. Каков формат воспроизводимого элемента? Это формат, который обещает длительность? Некоторые форматы потокового вещания не имеют длительности (это могут быть прямые трансляции). Сначала вы должны проверить CMTIME_IS_INDEFINITE(duration) .

2. @RobNapier Это mp3-файл (подкасты). он работал в течение 2 недель, чем остановился

3. Если бы это сработало, а затем остановилось, я бы посмотрел на данные, поступающие с сервера. Он по-прежнему обеспечивает продолжительность? Изменился ли сервер? И CMTIME_IS_INDEFINITE(duration) возвращает true? (Это означало бы, что он не считывает длительность)

4. Сервер @RobNapier не изменился, и CMTIME_IS_INDEFINITE (продолжительность) возвращает true. Если я сохраню файл, этот код сработает.