2016-03-31 18 views
3

Bu iki günden fazla süredir ilgileniyorum. Herhangi bir çözüm bulamadım lütfen.Görsel ya da manzara modunda Videonun tam ekran oynatıldığını tespit edin

İhtiyacım var Video çekim, tam ekran, yatay. Benim sorunum, videonun tam ekran manzarasını veya Portre'i nasıl oynadığını tanımlamaktır. viewWillTransitionToSize yöntemini uyguladık. Ancak AVPlayer tam ekran ok düğmesine sahiptir. Kullanıcı bu seçeneği nasıl tıkladığını nasıl tanımlayabilirim?

İkinci gereksinim, video tamamlandıktan sonra, video gösterisinin tekrarı veya sonraki veya önceki seçeneğin üzerinde görünüm oluşturur.

Bu benim kodum; Eğer AVPlayer ait AVPlayerItem bakarsak

if videoCellVal == nil { 
      videoCellVal = videoCell 

      comPlayerControl = AVPlayerViewController() 

      if let player = comPlayerControl { 

       let videoURL: String = "http://cdnapi.kaltura.com/p/11/sp/11/playManifest/entryId/"+selectedSubmission.transcodeRefId+"/format/applehttp/protocol/http/a.m3u8" 
       let playerItem = AVPlayerItem(URL: NSURL(string: videoURL)!) 
       commmentPlayer = AVPlayer(playerItem: playerItem) 
       player.player = commmentPlayer 
       player.view.frame = videoCell.frame 
       player.view.sizeToFit() 
       player.showsPlaybackControls = true 
       NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", 
        name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem) 


       videoCell.addSubview(player.view) 
      } 

     } 

     func playerDidFinishPlaying(note: NSNotification) { 
    print("Video Finished") 
    let DynamicView=UIView(frame: CGRectMake(100, 200, 100, 100)) 
    DynamicView.backgroundColor=UIColor.greenColor() 
    DynamicView.layer.cornerRadius=25 
    DynamicView.layer.borderWidth=2 
    DynamicView.bringSubviewToFront(self.view) 
    self.view.addSubview(DynamicView) 
} 

enter image description here

+0

gibi bir şey deneyebilirsiniz (tam ekran veya yatay tam ekran dikey) ? – Ramis

+0

3 senaryo sahibiyim. Satır içi video (sabit yüksek ve diğer kullanıcı arayüzü), tam ekranlı portre veya manzara. Burada portre veya manzara sadece bir sonraki, önceki video düğmesine göstermem gerekiyor. – Piraba

cevap

0

o zaman renderSize olan bir videoComposition ayarı vardır - Eğer yatay veya dikey olup olmadığını renderSizewidth ve height belirlemek için inceleyebilseydim . İçin

+0

'AVPlayer'daki öğeye ulaşmak için' currentItem' özelliğini kullanabilirsiniz – Edward

+0

'videoComposition' yalnızca" Dosya Tabanlı Oynatım "için geçerlidir,' http' üzerinden akış için desteklenmez; OP'nin durumunda çalışır. – Annjawn

4

Tam ekran veya AVPlayerViewController için Kvo kullanabilirsiniz video boyutu değişimi algılayarak, kodu şöyle olabilir: Eğer video kare/sınırlar içinde değişiklik kontrol edebilirsiniz change sözlüğünde

[comPlayerControl .addObserver(self, forKeyPath:"videoBounds" , options: NSKeyValueObservingOptions.New, context: nil)] 

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
      print("KeyPath \(keyPath)") 
     if keyPath == "videoBounds" { 
      print("New Video Bounds \(change)") 
     } 
    } 

Eğer viewWillTransitionToSize veya UIDeviceOrientationDidChangeNotification bildirim kullanmanız gerekebilir veya i sürmekte videoda değişiklik kontrol edebilirsiniz herhangi bir yöntem bulamadık gibi UIDevice.currentDevice().orientation kullanarak mevcut yönünü kontrol edebilirsiniz belirtildiği gibi dönme için

değiştirmek

Hala bu bağlantıyı kontrol edebilir, video yönünü tespit etmek için gerekirse: kodunuzda böyle sıfır zamanı ayarlayabilirsiniz videonun tekrarı için bu bağlantı

yılında https://stackoverflow.com/a/25833399/4557505 ve diğer cevap:

func playerDidFinishPlaying(notification: NSNotification) { 
     if let item = notification.object as? AVPlayerItem { 
      item.seekToTime(kCMTimeZero) 
      //you may directly play the video or can do further processing 
     } 
    } 

Eğer sen contentOverlayView

yılında bir sonraki tekrarını, önceki düğmeyi koyarak deneyebilirsiniz commmentQueuePlayer.advanceToNextItem()

ile deneyebilirsiniz öğenin sonundaki kuyrukta öğeyi oynamak İçin

let topView = UIView(frame: CGRectMake(0,0, comPlayerControl.view.bounds.width,44)) 
     topView.backgroundColor = UIColor (red: 0.5, green: 0.5, blue: 0.5, alpha: 0.379) 
     let btnNext = UIButton(frame:CGRectMake(0,0,80,44)) 
     btnNext.setTitle("Next", forState:.Normal) 
     btnNext.addTarget(self, action:"playNext", forControlEvents:.TouchUpInside) 
     btnNext.userInteractionEnabled = true 
     btnNext.enabled = true 
     topView.addSubview(btnNext) 
     comPlayerControl.contentOverlayView?.addSubview(topView) 

Güncelleme

observeValueForKeyPath sen hangi modda video oynuyor bilmek gerekir yapmak neden bu

var avWidth:CGFloat = 0 
var avHeight:CGFloat = 0 

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    if keyPath == "videoBounds" { 
     let rect = change!["new"]! as! NSValue 

     if let newrect = rect.CGRectValue() as CGRect? { 
      if newrect.width > 0 || newrect.height > 0 { 
       if avWidth > 0 || avHeight > 0 { 
        if newrect.width > avWidth || newrect.height > avHeight { 
         print("Full Screen") 
        } else if newrect.width < avWidth || newrect.height < avHeight { 
         print("Normal screen") 
        } else { 

        } 
       } 
       avWidth = newrect.width 
       avHeight = newrect.height 
      } 
     } 
    } 
} 
+0

Yanıt için teşekkürler. Next butonuna bastığımda, butonu tetiklemedi. 'func playNext() { print (" === playNext ") }' – Piraba

+0

Bana 'observeValueForKeyPath 'işlevinin kodu olan' codeerveValueForKeyPath 'kodunu – Piraba

+0

verebilir misiniz, yoksa tam kod ister misiniz? bağlı boyutunu kontrol etmek için? – HardikDG

İlgili konular