2015-07-20 4 views
1

Я попытался это одно: How do you loop AVPlayer in Swift? но когда видео endst врежетсяLooping быстрого видео AVPlayer быстрого

моего код:

super.viewDidLoad() 
    var moviePlayer : MPMoviePlayerController? 
    let myPlayerView = UIView(frame: self.view.bounds) 
    myPlayerView.backgroundColor = UIColor.blackColor() 
    view.addSubview(myPlayerView) 

    var urlpath = NSBundle.mainBundle().pathForResource("bgivd", ofType: "mp4") 
    let url:NSURL = NSURL.fileURLWithPath(urlpath!)! 

    // Make a player 
    let myPlayer = AVPlayer(URL: url) 
    myPlayer.play() 


    let avLayer = AVPlayerLayer(player: myPlayer) 
    avLayer.frame = myPlayerView.bounds 
    myPlayerView.layer.addSublayer(avLayer) 
    myPlayerView.superview?.sendSubviewToBack(myPlayerView) 

моего кода цикл журнал

NSNotificationCenter.defaultCenter().addObserver(self, 
    selector: "playerItemDidReachEnd:", 
    name: AVPlayerItemDidPlayToEndTimeNotification, 
    object: myPlayer.currentItem) 

    func playerItemDidReachEnd(notification: NSNotification) { 
     myPlayer.seekToTime(kCMTimeZero) 
     myPlayer.play() 
    } 

ошибки: http://pastebin.com/bN2fc29G

по какой-то причине ошибки в коде в stackoverflow, поэтому я поместил его в pastebin

+0

Вы даже не показываете нам свой код цикла, поэтому вам сложно помочь вам. – pbush25

+0

Извините, добавленный код цикла – OvidijusR

+0

И как он падает? Трассировка стека, пожалуйста ;-) – rholmes

ответ

2

Я сделал себя обычным Looping AVPlayer некоторое время назад, не стесняйтесь использовать/комментировать!

protocol LoopingPlayerProgressDelegate: class { 
    func loopingPlayer(loopingPlayer: LoopingPlayer, didLoad percentage: Float) 
    func loopingPlayer(loopingPlayer: LoopingPlayer, didFinishLoading succeeded: Bool) 
} 

class LoopingPlayer: AVPlayer { 

    weak var progressDelegate: LoopingPlayerProgressDelegate? 

    var loopCount: Double = 0 
    var timer: NSTimer? 

    override init() { 
     super.init() 
     self.commonInit() 
    } 

    override init(URL url: NSURL!) { 
     super.init(URL: url) 
     self.commonInit() 
    } 

    override init(playerItem item: AVPlayerItem!) { 
     super.init(playerItem: item) 
     self.commonInit() 
    } 

    func commonInit() { 
     self.addObserver(self, forKeyPath: "currentItem", options: .New, context: nil) 
     self.actionAtItemEnd = .None 
     NSNotificationCenter.defaultCenter().addObserver(self, selector:"playerDidPlayToEndTimeNotification:", name:AVPlayerItemDidPlayToEndTimeNotification, object:nil) 
     if mutePlayers == true { 
      self.volume = 0.0 
     } 
     NSNotificationCenter.defaultCenter().addObserver(self, selector:"mute", name:"MutePlayers", object:nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector:"unmute", name:"UnmutePlayers", object:nil) 
    } 

    deinit { 
     self.timer?.invalidate() 
     self.removeObserver(self, forKeyPath: "currentItem") 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func mute() { 
     self.volume = 0.0 
    } 

    func unmute() { 
     self.volume = 1.0 
    } 

    var playableDuration: CMTime { 
     get { 
      if let item: AnyObject = self.currentItem?.loadedTimeRanges?.first { 
       if let timeRange = item.CMTimeRangeValue { 
        let playableDuration = CMTimeAdd(timeRange.start, timeRange.duration) 
        return playableDuration 
       } 
      } 
      return kCMTimeZero 
     } 
    } 

    var loadingProgress: Float { 
     get { 
      if (self.currentItem == nil) { 
       self.timer?.invalidate() 
       self.progressDelegate?.loopingPlayer(self, didFinishLoading: false) 
       return 0 
      } 
      let playableDurationInSeconds = CMTimeGetSeconds(self.playableDuration) 
      let totalDurationInSeconds = CMTimeGetSeconds(self.currentItem.duration) 
      if (totalDurationInSeconds.isNormal) { 
       var progress = Float(playableDurationInSeconds/totalDurationInSeconds) 
       self.progressDelegate?.loopingPlayer(self, didLoad: progress) 
       if (progress > 0.90) { 
        self.progressDelegate?.loopingPlayer(self, didFinishLoading: true) 
        self.timer?.invalidate() 
       } 
       return progress 
      } 
      return 0 
     } 
    } 

    func playerDidPlayToEndTimeNotification(notification: NSNotification) { 
     let playerItem: AVPlayerItem = notification.object as! AVPlayerItem 
     if (playerItem != self.currentItem) { 
      return 
     } 
     self.seekToTime(kCMTimeZero) 
     self.play() 
     loopCount += 1 
    } 

    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
     if keyPath == "currentItem" { 
      self.timer?.invalidate() 
      self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "loadingProgress", userInfo: nil, repeats: true) 
     } 
    } 
} 

Это было какое-то время, когда я это сделал, поэтому он может быть немного пыльным. Извини за это!

Он также работает с файлами ЗОЖИ;)

Надеется, что это поможет!

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