2016-03-31 2 views
3

Я занимаюсь этим более двух дней. Я не мог получить какое-либо решение, пожалуйста.Обнаружение видео в полноэкранном режиме в портретном или ландшафтном

У меня есть требование, чтобы видео должно было играть в портретный, полный экран, пейзаж. Моя проблема заключается в том, как определить, что видео воспроизводит полноэкранный альбом или портрет. Я применил метод viewWillTransitionToSize. Но у AVPlayer есть кнопка со стрелкой в ​​полноэкранном режиме. Как я могу определить, что пользователь нажал эту опцию.

Второе требование, после завершения видео, создать представление поверх воспроизведения видеороликов или следующей или предыдущей опции.

Это мой код;

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

Почему вы должны знать, в каком режиме воспроизведения видео (портрет в полноэкранном режиме или ландшафтном полноэкранном режиме) ? – Ramis

+0

У меня есть 3 сценария. Встроенное видео (фиксированное высокое и ниже другого пользовательского интерфейса), полноэкранный портрет или пейзаж. Здесь портрет или пейзаж только мне нужно показать следующую, предыдущую кнопку видео. – Piraba

ответ

0

, если вы посмотрите на AVPlayerItem в AVPlayer то он имеет videoComposition установку, которая имеет renderSize - вы могли бы изучить renderSizewidth и height, чтобы определить, если вы находитесь в альбомной или портретной ,

+0

, вы можете использовать свойство 'currentItem' для доступа к элементу в' AVPlayer' – Edward

+0

'videoComposition' применим только для« File Based Playback », он не поддерживается для потоковой передачи через' http', что означает, что он явно не будет работать в случае OP. – Annjawn

4

Для обнаружения на весь экран или изменение размера видео, которое вы можете использовать КВО для AVPlayerViewController, код может выглядеть так:

[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)") 
     } 
    } 

В change словаре вы можете проверить изменения в видеокадров/пределы изменить

для вращения, как вы упомянули, возможно, придется использовать viewWillTransitionToSize или UIDeviceOrientationDidChangeNotification уведомления или вы можете проверить текущую ориентацию с помощью UIDevice.currentDevice().orientation, как я не нашел какой-либо метод, который может проверить изменения в текущем видео

Тем не менее, если вам нужно определить ориентацию видео вы можете проверить эту ссылку: https://stackoverflow.com/a/25833399/4557505 и другой ответ в этой связи

Для повтора видео вы можете установить время до нуля, как это в вашем коде:

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 
     } 
    } 

играть элемент в очереди в конце этого пункта вы можете попробовать с commmentQueuePlayer.advanceToNextItem()

вы можете попробовать поставить воспроизведение, следующий, предыдущий кнопки в contentOverlayView

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) 

Update

Для observeValueForKeyPath вы можете попробовать что-то вроде этого

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

Спасибо за ответ. Когда я нажимаю кнопку «Далее», кнопка не запускается. 'func playNext() { print (" === playNext ") }' – Piraba

+0

Не могли бы вы дать код 'observValueForKeyPath' – Piraba

+0

, в первом блоке кода есть код функции watchValueForKeyPath или вы хотите полный код проверить размер границы? – HardikDG

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