2017-01-09 5 views
0

Я пытаюсь сделать AVPlayer резюме от того, где он остановился, путем сделать глобальное значение типа CMtime и хранить CurrentTime затем использовать его, чтобы возобновить воспроизведение с места остановкиAVPlayer всегда начинается с начала

Мой код:

override func viewDidLoad() { 
     super.viewDidLoad()  

      url = URL(string: "https://s3.amazonaws.com/kargopolov/kukushka.mp3")! 
      let playerItem:AVPlayerItem = AVPlayerItem(url: url as URL) 
      player = AVPlayer(playerItem: playerItem) 


      let duration : CMTime = playerItem.asset.duration 
      let seconds : Float64 = CMTimeGetSeconds(duration) 

      playbackSlider!.maximumValue = Float(seconds) 

      playbackSlider?.addTarget(self, action: #selector(playbackSliderValueChanged(_:)), for: .valueChanged) 
      self.view.addSubview(playbackSlider!) 


      player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) { (CMTime) -> Void in 
       if player!.currentItem?.status == .readyToPlay { 
        let time : Float64 = CMTimeGetSeconds(player!.currentTime()) 

        self.playbackSlider!.value = Float (time) }} 


@IBAction func playbackSliderValueChanged(_ sender: UISlider) { 

     let seconds : Int64 = Int64(playbackSlider.value) 
     let targetTime:CMTime = CMTimeMake(seconds, 1) 

     player!.seek(to: targetTime) 

     if player!.rate == 0 
     { 
      player?.play() 
     } 

    } 

Когда я пытаюсь использовать seek (to :) ничего не изменилось, это также начинается с начала!

я пытаюсь изменить CURRENTTIME с помощью

if let currentTime = player?.currentTime() { 
     player?.seek(to: times2! ) 
    } 

я не знаю, почему он всегда начинается с начала я использовал AVAudioPlayer, и это было гораздо проще, чем AVPlayer , но потому, что мне нужно, чтобы поток Audio I изменить его AVPlayer

ответ

0

Я нашел решение,

  1. Я получил секунд от CMtime используя Тхи s-код и добавить его на функцию SEGUE Анвайнд

    let t1 = Float((player?.currentTime().value)!) 
    let t2 = Float((player?.currentTime().timescale)!) 
    times2 = t1/t2 
    // time2 is a global value of type float 
    
    nameOfTheAudioWasPlaying = Array[SelectedRow].Title!  // nameOfTheAudioWasPlaying is also a global value of type String 
    

2.В viewdidload Я использую этот код

if Array[SelectedRow].Title! == nameOfTheAudioWasPlaying { 
     player?.seek(to: CMTimeMakeWithSeconds(Float64(times2), 1)) 
     player?.play() 


    }else { 
     player?.play() 

    } 

это решение, но не идеальное решение, каждый раз, когда он повторно загрузки аудиофайл, чтобы возобновить его, что означает, что если я играю в файл, а затем возвращаюсь в таблицу, а затем возвращаюсь обратно, он будет кошелек и ждать секунду, а затем воспроизвести его с того места, где он остановлен.

Смежные вопросы