2016-03-31 32 views
3

私は2日以上これをやりました。私は解決策を得ることができませんでした。ビデオを縦方向または横方向に全画面で再生します。

私は、ビデオがポートレートインライン、フルスクリーン、ランドスケープを再生する必要があります。ここで私の問題は、ビデオがフルスクリーンの風景やポートレートを再生していることを識別する方法です。私はviewWillTransitionToSizeメソッドを実装しました。しかしAVPlayerにはフルスクリーンの矢印ボタンがあります。ユーザーがそのオプションをクリックしたことをどのように識別できるか。

第2の要件は、ビデオが完成したら、ビデオ再生の再生または次または以前のオプションの上にビューを作成することです。

これは私のコードです。

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つのシナリオを持っています。インラインビデオ(固定ハイ&下の他のUI)、フルスクリーンのポートレイトまたはランドスケープここでは、私は次に、前のビデオボタンを表示する必要がある肖像画や風景のみ。 – Piraba

答えて

0

あなたがAVPlayerAVPlayerItemを見れば、それはrenderSizeを持ってvideoComposition設定を持っている - あなたは風景やポートレートであるかどうかを判断するためにrenderSizewidthheightを調べることができ。

+0

'currentItem'プロパティを使用して' AVPlayer'のアイテムを取得することができます – Edward

+0

'' VideoComposition'は "File Based Playback"にのみ適用でき、 'http'でのストリーミングには対応していません。 OPの場合に働きます。 – Annjawn

4

あなたがAVPlayerViewControllerためKVOを使用することができますフルスクリーンやビデオサイズの変更を検出するために、コードは次のようにすることができます:あなたは、ビデオフレーム/境界の変化を確認することができますchange辞書に

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

あなたはviewWillTransitionToSizeUIDeviceOrientationDidChangeNotification通知を使用する必要がありますか私は現在進行中のビデオ

0の変化を確認することができます任意の方法を見つけることができませんでしたとして、あなたが 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

0123で再生、次、前のボタンを入れてみてください
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) 

更新

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

お返事ありがとうございます。 [次へ]ボタンをクリックすると、トリガされませんでした。 'foo playNext(){ print(" === playNext ") }' – Piraba

+0

'observeValueForKeyPath'コード – Piraba

+0

を最初のコードブロックに' observeValueForKeyPath '関数のコードがありますか、それとも完全なコードが必要ですかバインドされたサイズをチェックするには? – HardikDG

関連する問題