首页 文章

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

提问于
浏览
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

2 回答

  • 6

    对于检测全屏或视频大小更改,您可以使用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://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

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

相关问题