2015-07-20 97 views
1

我想这一个:How do you loop AVPlayer in Swift?但是当视频endst崩溃循环迅速视频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

由于某些原因代码故障所以我把它放到了pastebin中

+0

你甚至没有向我们展示你的循环代码,所以很难帮助你。 – pbush25

+0

对不起,添加了循环代码 – OvidijusR

+0

而且,它是如何崩溃的?堆栈跟踪,请;-) – rholmes

回答

2

前段时间我已经让自己定制了一个循环的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) 
     } 
    } 
} 

它已经有一段时间了,因此它可能有点尘土飞扬。对于那个很抱歉!

它也适用于HLS文件;)

希望这会有所帮助!