2016-08-31 21 views
7

我嘗試使用AVPlayerLooper循環播放電視操作系統應用中的視頻,因爲在播放視頻時,應該消除暫停/ hicup。我觀看了WWDC2016視頻https://developer.apple.com/videos/play/wwdc2016/503/並試圖實現代碼,但它不循環。 我有一個PlayerViewController繼承AVPlayerViewController。我讓代碼讓視頻循環。如果我有下面的代碼,它什麼都不顯示。如果我將第二行改爲self.queuePlayer = AVQueuePlayer(playerItem:playerItem),它只會播放一次。如何使用AVPlayerLooper循環播放視頻

let playerItem = AVPlayerItem(url: url as URL) 
    self.queuePlayer = AVQueuePlayer() //I declared this as a variable in the view controller 
    self.playerLayer = AVPlayerLayer(player: self.queuePlayer) //I declared this as a variable in the view controller 
    let playerLooper = AVPlayerLooper(player: self.queuePlayer!, templateItem: playerItem) 
    self.view.layer.addSublayer(self.playerLayer!) 
    self.playerLayer?.frame = self.view.frame 
    self.queuePlayer?.play() 

有沒有人成功地玩最新的AVPlayerLooper環狀視頻?

+0

FYI:這裏有示例代碼:https://developer.apple.com/library/content/samplecode/avloopplayer/Introduction/Intro.html從WWDC 2016(https://developer.apple.com/樣本代碼/ WWDC/2016 /) – iwasrobbed

回答

10

我自己解決了這個問題。

playerLooper必須是類中的成員變量,否則它不起作用,因爲在調用該方法後局部變量消失了。所以我把這條線放在課程的開始處宣佈它。我沒有將其聲明爲AVPlayerLooper,因爲這僅適用於tvos10.0和更新版本。我希望我的課程適應tvos9.0。 這是我的工作代碼。

var playerLooper: NSObject? 
var playerLayer:AVPlayerLayer! 
var queuePlayer: AVQueuePlayer? 


func playVideo(_ filmName: String){ 
    if let path = Bundle.main.path(forResource: filmName, ofType: "mov") { 
     let url = URL(fileURLWithPath: path) 

     if #available(tvOS 10.0, *) { 

      // Use a new player looper with the queue player and template item 
      let playerItem = AVPlayerItem(url: url as URL) 
      self.player = AVQueuePlayer(items: [playerItem]) 
      self.playerLayer = AVPlayerLayer(player: self.player) 
      self.playerLooper = AVPlayerLooper(player: self.player! as! AVQueuePlayer, templateItem: playerItem) 
      self.view.layer.addSublayer(self.playerLayer!) 
      self.playerLayer?.frame = self.view.frame 
      self.player?.play() 


     } else { 
      // Fallback on earlier versions, this solution has hicup at end 
      player = AVPlayer(url: url) 
      player?.play() 
      loopVideo(player!) 
     } 

    } 
} 

func loopVideo(_ videoPlayer: AVPlayer) { 
    NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil, queue: nil) { notification in 
     if(!self.isStopped){ 

      videoPlayer.seek(to: kCMTimeZero) 
      videoPlayer.play() 

     } 
    } 
}