2017-01-21 13 views
1

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

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

Если вы видите картинку ниже, то вы увидите, что я имею в виду. Это идет от целых минут: секунды 3:00, к странным цифрам 3: -1 ect.

enter image description here enter image description here

любые идеи, что я сделал не так?

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

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) 

    } 
}) 

ответ

2

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

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 набора текста возвращаемого значения

только две строки кода

+0

Это очень хороший чистый способ достижения этой цели. Спасибо, что поделился! – Pippo

+1

Как сторона не, это сгладило мою очистку также. двойная победа! – Pippo

+0

@Pippo Спасибо и счастливое кодирование –