Как заставить Scrubbing работать на UISlider с помощью AVAudioPlayer - PullRequest
1 голос
/ 17 января 2020

Так что я использую довольно уникальную версию аудиоплеера, и все работает, кроме очистки дорожки. Следует отметить, что треки буферизируются и собираются с веб-сайта. Я думал, что это может иметь отношение к наблюдателям, которых я использую. Но я не знаю, правда ли это. Я могу назвать длительность трека и получить анимацию реального UISlider в сочетании с прогрессом трека. Но я не могу скрести вперед или назад. В итоге я могу двигать ползунок, но прогресс трека не движется вместе с ним. Вот что у меня есть:

override func viewDidLoad() {

       audio.initialize(config: ["loop": true]) { (playerItem, change) in
           var duration = CMTimeGetSeconds(playerItem.duration)
           self.scrubSlider.maximumValue = Float(duration)
       }

        scrubSlider.setThumbImage(UIImage(named: "position_knob"), for: .normal)       
}

    override func viewDidAppear(_ animated: Bool) {

        scrubSlider.value = 0.0
        print(audio.seekDuration())
        self.scrubSlider.maximumValue = audio.seekDuration()

        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.trackAudio), userInfo: nil, repeats: true)
        print(self.scrubSlider.maximumValue)

    }

@objc func trackAudio() {
          var currentTime = audio.seekCurrentTime()
          print(currentTime)
          scrubSlider.value = currentTime
          var duration = audio.seekDuration()

          let remainingTimeInSeconds = duration - currentTime
          timeElapsedLabel.text = audio.createTimeString(time: currentTime)
          timeRemainingLabel.text = audio.createTimeString(time: remainingTimeInSeconds)



    }

    @IBAction func scrubberValueChanged(_ sender: UISlider) {
        print("Entro")
        var currentTime = (CMTimeGetSeconds((audio.playerQueue?.currentItem!.currentTime())!))
        currentTime = (Float64)((scrubSlider.value))

    }

Вот наблюдатель, где я собираю продолжительность:

      /**
       Setup observers to monitor playback flow
      */
    private func setupObservers(completion: @escaping (AVPlayerItem, Any) -> ()) {

              // listening for current item change
              self.audioQueueObserver = self.playerQueue?.observe(\.currentItem, options: [.new]) { [weak self] (player, _) in

                  print("media item changed...")
                  print("media number ", self?.playerQueue?.items() as Any, self?.playerQueue?.items().count as Any, self?.playerQueue?.currentItem as Any)
                  // loop here if needed //
                  if self?.audioPlayerConfig["loop"] as! Bool == true && self?.playerQueue?.items().count == 0 && self?.playerQueue?.currentItem == nil {
                      self?.playerQueue?.removeAllItems()
                      self?.playerQueue?.replaceCurrentItem(with: nil)
                      for item:AVPlayerItem in (self?.AVItemPool)! {
                        item.seek(to: CMTime.zero)
                          self?.playerQueue?.insert(item, after: nil)
                      }
                      self?.playerQueue?.play()
                  }
              }

              // listening for current item status change
              self.audioQueueStatusObserver = self.playerQueue?.currentItem?.observe(\.status, options:  [.new, .old], changeHandler: { (playerItem, change) in
                  guard let currentItemDuration = self.playerQueue?.currentItem?.duration else { return }
                  if playerItem.status == .readyToPlay {
                      print("current item status is ready")
                      print("media Queue ", self.playerQueue?.items() as Any, self.playerQueue?.items().count as Any)
                      print("item duration ", CMTimeGetSeconds(playerItem.duration))
                      print("itemD ", CMTimeGetSeconds(currentItemDuration))
                      print(currentItemDuration)
                      completion(playerItem, change)
                  }
              })
...