2016-01-21 57 views
1

如何从AVPlayer获取视频的视频大小以设置节点的几何大小?确定SceneKit中SKVideoNode的视频大小/长宽比

例如,我所以现在有一个宽度和高度

let planeGeo = SCNPlane(width: 5, height: 5) 

所以现在我实例化我的视频播放器

let videoURL = NSURL(string: someURL) 
let player = AVPlayer(URL: videoURL!) 

的SCNPlane和我SKVideoNode

let spriteKitScene = SKScene(size: CGSize(width: 1920, height: 1080)) 
spriteKitScene.scaleMode = .AspectFit 

videoSpriteKitNode = SKVideoNode(AVPlayer: player) 
videoSpriteKitNode.anchorPoint = CGPointMake(0,0) 
videoSpriteKitNode.size.width = spriteKitScene.size.width 
videoSpriteKitNode.size.height = spriteKitScene.size.height 

spriteKitScene.addChild(videoSpriteKitNode) 

planeGeo!.firstMaterial.diffuse.contents = spriteKitScene 
videoSpriteKitNode.play() 

我希望将视频大小调整到正确的宽高比。我已经与AVLPlayerLayer拨弄左右,但这个让我始终为0

let avLayer = AVPlayerLayer(player: player) 
print(avLayer.videoRect.width) //0 
print(avLayer.videoRect.height) //0 

而且我想,在这里,但它不工作,以及

let avLayer = AVPlayerLayer(player: player) 
let layer = avLayer.sublayers![0] 
let transformedBounds = CGRectApplyAffineTransform(layer.bounds, CATransform3DGetAffineTransform(layer.sublayerTransform)) 
print(transformedBounds.width) //0 
print(transformedBounds.height) //0 

回答

0

好吧,我想通了,志愿是必经之路走。添加在viewDidLoad中:

player.currentItem?.addObserver(self, forKeyPath: "presentationSize", options: .New, context: nil) 

在DEINIT:

player.currentItem?.removeObserver(self, forKeyPath: "presentationSize") 

,然后添加:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 

    if keyPath == "presentationSize" { 
     if let item = object as? AVPlayerItem { 
      let size = item.presentationSize 
      let width = size.width 
      let height = size.height 

      //Set size of geometry here 
     } 
    } 
}