检测以纵向或横向全屏播放的视频
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
字典中,您可以检查视频帧/边界变化的变化
对于您提到的旋转,您可能必须使用viewWillTransitionToSize
或UIDeviceOrientationDidChangeNotification
通知,或者您可以使用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】:
如果您查看AVPlayer
的AVPlayerItem
,那么它的videoComposition
设置具有renderSize
- 您可以检查renderSize
width
和height
以确定您是否是横向还是纵向。
【讨论】:
可以使用currentItem
属性获取AVPlayer
中的项目
videoComposition
仅适用于“基于文件的播放”,不支持通过http
进行流式传输,这意味着它显然不适用于 OP。以上是关于检测以纵向或横向全屏播放的视频的主要内容,如果未能解决你的问题,请参考以下文章