2016-08-31 32 views
7

Bir videoyu TV OS uygulamasında AVPlayerLooper ile döngülemeye çalışıyorum; çünkü bu, videoyu tekrar oynatırken duraklatma/hıçkırıklıktan kurtulmalıdır. WWDC2016 videosunu https://developer.apple.com/videos/play/wwdc2016/503/ izledim ve kodu uygulamaya çalıştım ama dönmüyor. AVPlayerViewController'u geçen bir PlayerViewController var. Video döngüsüne izin vermek için kodu koydum. Aşağıdaki koda sahip olursam, hiçbir şey göstermez. İkinci satırı self.queuePlayer = AVQueuePlayer(playerItem:playerItem) olarak değiştirirsem, sadece bir kez oynatılır. AVPlayerLooper ile video nasıl döngü yapılır

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() 

Aranızda son AVPlayerLooper ile ilmek video oynatırken başardı mı?

+0

: örnek kod var burada: https://developer.apple.com/library/content/samplecode/avloopplayer/Introduction/Intro.html WWDC 2016 (dan https://developer.apple.com/ örnek kod/WWDC/2016 /) – iwasrobbed

cevap

10

Sorunu kendim çözdüm.

OyuncuLooper, sınıfta bir üye değişkeni olmalıdır, aksi halde işe yaramadı, çünkü yöntem çağrıldıktan sonra yerel bir değişken gitti. Bu yüzden bunu ilan etmek için dersin başlangıcına koyuyorum. Bunu bir AVPlayerLooper olarak bildirmedim çünkü bu sadece tvos10.0 ve daha yeni sürümler içindir. Sınıfımın tvos9.0'a uyarlanmasını istiyorum. Bu benim çalışma kodum. Bilginize

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() 

     } 
    } 
} 
İlgili konular