Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect AVPlayer actually started to play in swift

Hello I have set my UISliderminimum value to 0.00. Then I set it's max value in this way.

self.viewPlayer.layer.addSublayer(playerLayer)     let duration : CMTime = avPlayer.avPlayer.currentItem!.asset.duration     let seconds : Float64 = CMTimeGetSeconds(duration)      sliderBar.maximumValue=Float(seconds)     sliderBar!.isContinuous = false     sliderBar!.tintColor = UIColor.green 

But I am getting this exception

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to set a slider's minimumValue (0.000000) to be larger than the maximumValue (nan)' enter code here 

I know after prepareForPlay() to actual playing it takes some time to really play the video. So how can I detect when the player really started to play the video? Please help me. Thanks

like image 286
user1960169 Avatar asked Nov 24 '16 08:11

user1960169


People also ask

How do I know if a player is playing in Swift?

Currently with swift 5 the easiest way to check if the player is playing or paused is to check the . timeControlStatus variable.

How do I disable AVPlayer?

AVPlayer does not have a method named stop . You can pause or set rate to 0.0. Show activity on this post. I usually seekToTime 0.0, then pause.


1 Answers

Since iOS 10 you can observe timeControlStatus property of AVPlayer. It can be .playing.

Check the code:

private func setupAVPlayer() {     avPlayer.addObserver(self, forKeyPath: "status", options: [.old, .new], context: nil)     if #available(iOS 10.0, *) {         avPlayer.addObserver(self, forKeyPath: "timeControlStatus", options: [.old, .new], context: nil)     } else {         avPlayer.addObserver(self, forKeyPath: "rate", options: [.old, .new], context: nil)     } }  override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {     if object as AnyObject? === avPlayer {         if keyPath == "status" {             if avPlayer.status == .readyToPlay {                 avPlayer.play()             }         } else if keyPath == "timeControlStatus" {             if #available(iOS 10.0, *) {                 if avPlayer.timeControlStatus == .playing {                     videoCell?.muteButton.isHidden = false                 } else {                     videoCell?.muteButton.isHidden = true                 }             }         } else if keyPath == "rate" {             if avPlayer.rate > 0 {                 videoCell?.muteButton.isHidden = false             } else {                 videoCell?.muteButton.isHidden = true             }         }     } } 
like image 78
Renatus Avatar answered Sep 21 '22 06:09

Renatus