检测以纵向或横向全屏播放的视频

Posted

技术标签:

【中文标题】检测以纵向或横向全屏播放的视频【英文标题】:Detect Video playing full screen in Portrait or landscape 【发布时间】:2016-03-31 02:47:42 【问题描述】:

我参与了这两天多。请问我没有解决办法。

我的要求是视频应该播放纵向、全屏、横向。我的问题是如何识别视频正在播放全屏横向或纵向。我已经实现了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)

【问题讨论】:

为什么需要知道视频播放的模式(纵向全屏或横向全屏)? 我有 3 个场景。内嵌视频(固定在其他 UI 的上方和下方),全屏纵向或横向。这里只有纵向或横向我需要显示下一个,上一个视频按钮。 【参考方案1】:

为了检测全屏或视频大小的变化,你可以使用 KVO 的 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 字典中,您可以检查视频帧/边界变化的变化

对于您提到的旋转,您可能必须使用viewWillTransitionToSizeUIDeviceOrientationDidChangeNotification 通知,或者您可以使用UIDevice.currentDevice().orientation 检查当前方向,因为我没有找到任何方法可以检查正在进行的视频中的变化

如果您需要检测视频方向,您可以查看此链接:https://***.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) 

更新

对于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
            
        
    

【讨论】:

感谢您的回复。当我单击 Next button 时,它没有触发按钮。 func playNext() print("===playNext") 第一个代码块里有observeValueForKeyPath 函数的代码,还是要完整代码检查绑定大小? @HardikDG 我们可以使用 KVO 知道何时按下全屏按钮吗?【参考方案2】:

如果您查看AVPlayerAVPlayerItem,那么它的videoComposition 设置具有renderSize - 您可以检查renderSize widthheight 以确定您是否是横向还是纵向。

【讨论】:

可以使用currentItem属性获取AVPlayer中的项目 videoComposition 仅适用于“基于文件的播放”,不支持通过http 进行流式传输,这意味着它显然不适用于 OP。

以上是关于检测以纵向或横向全屏播放的视频的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flatlist 单击播放按钮以全屏(横向)播放视频

swift 3 - 旋转到横向时全屏播放视频

如何在 Android WebView 中以横向全屏播放视频?

以纵向模式在videoview中全屏制作视频[重复]

横向和纵向播放视频

YouTubePlayerView 全屏将视频捕捉到顶部