periodTimeObserver для отсчета продолжительности в AVPlayer с Swift

У меня есть наблюдатель времени для AVPlayer, который прекрасно работает. Я пытаюсь получить его отсчет от продолжительности аудио 0.

Это работает и ведет обратный отсчет, сейчас у меня просто проблемы с форматированием.

если вы увидите картинку ниже, вы поймете, что я имею в виду. Он идет от целых минут: секунд 3:00 до странных чисел 3:-1 и т. Д.

введите описание изображения здесь введите описание изображения здесь

Есть идеи, что я сделал не так?

вот код для таймера:

let interval = CMTime(value: 1, timescale: 1)
self.audioPlayer?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { (progressTime) in

let secondsProgress = CMTimeGetSeconds(progressTime)

    let secondsStringProgress = String(format: "%02d", Int((secondsProgress.truncatingRemainder(dividingBy: 60))))
    let minuitesStringProgress = String(format: "%02d", Int(secondsProgress) / 60)
    //self.countDownLabel.text = "\(minuitesStringProgress):\(secondsStringProgress)"

    if let duration = self.audioPlayer?.currentItem!.asset.duration {

        let secondsDuration = CMTimeGetSeconds(duration)

            let secondsStringDuration = String(format: "%02d", Int((secondsDuration.truncatingRemainder(dividingBy: 60))))
            let minuitesStringDuration = String(format: "%02d", Int(secondsDuration) / 60)

                let secondsString = String(format: "%02d", Int(secondsStringDuration)! - Int(secondsStringProgress)!)
                let minuitesString = String(format: "%02d", Int(minuitesStringDuration)! - Int(minuitesStringProgress)!)

            self.countDownLabel.isHidden = false
            self.countDownLabel.text = "\(minuitesString):\(secondsString)"

        self.horizontalSlider.value = Float(secondsProgress / secondsDuration)
        self.circleSlider.value = Float(secondsProgress / secondsDuration)

    }
})

1 ответ

Решение

Я использую эту функцию для отображения форматированной даты

  func getFormatedTime(FromTime timeDuration:Int) -> String {

    let minutes = Int(timeDuration) / 60 % 60
    let seconds = Int(timeDuration) % 60
    let strDuration = String(format:"%02d:%02d", minutes, seconds)
    return strDuration
  }

использовать как это

        let strDuration = self.getFormatedTime(FromTime: recordingDuration)

или прямо так в addPeriodicTimeObserver метод

      recordingDuration = Float(CMTimeGetSeconds((self.playerItem?.asset.duration)!))-Float(CMTimeGetSeconds((self.playerItem?.currentTime())!))

передать это getFormatedTime установить текст возвращаемого значения

всего две строки кода

Другие вопросы по тегам