SKVideoNode仅在节点或摄像机移动时在SCNScene中渲染

时间:2015-11-10 21:51:12

标签: ios swift avfoundation scenekit

我使用一种非常简单的方法来设置SKVideoNode,并通过几何体的漫反射内容将其放置在SCNNode中。当我这样做时,时间纹理更新并正确显示视频是摄像机或节点移动的时间。当两者都静止不动时,纹理永远不会更新(就像视频不会播放一样),但声音确实会播放。

显然它还在播放视频,但渲染不正确。我不明白为什么。

func setupAndPlay() {

    // create the asset & player and grab the dimensions
    let path = NSBundle.mainBundle().pathForResource("indycar", ofType: "m4v")!
    let asset = AVAsset(URL: NSURL(fileURLWithPath: path))
    let size = asset.tracksWithMediaType(AVMediaTypeVideo)[0].naturalSize

    let player = AVPlayer(playerItem: AVPlayerItem(asset: asset))

    // setup the video SKVideoNode
    let videoNode = SKVideoNode(AVPlayer: player)
    videoNode.size = size
    videoNode.position = CGPoint(x: size.width * 0.5, y: size.height * 0.5)

    // setup the SKScene that will house the video node
    let videoScene = SKScene(size: size)
    videoScene.addChild(videoNode)

    // create a wrapper ** note that the geometry doesn't matter, it happens with spheres and planes
    let videoWrapperNode = SCNNode(geometry: SCNSphere(radius: 10))
    videoWrapperNode.position = SCNVector3(x: 0, y: 0, z: 0)

    // set the material's diffuse contents to be the video scene we created above
    videoWrapperNode.geometry?.firstMaterial?.diffuse.contents = videoScene
    videoWrapperNode.geometry?.firstMaterial?.doubleSided = true

    // reorient the video properly
    videoWrapperNode.scale.y = -1
    videoWrapperNode.scale.z = -1

    // add it to our scene
    scene.rootNode.addChildNode(videoWrapperNode)

    // if I uncomment this, the video plays correctly; if i comment it, the texture on the videoWrapperNode only 
    // get updated when I'm moving the camera around. the sound always plays properly.
    videoWrapperNode.runAction( SCNAction.repeatActionForever( SCNAction.rotateByAngle(CGFloat(M_PI * 2.0), aroundAxis: SCNVector3(x: 0, y: 1, z: 0), duration: 15.0 )))

    videoNode.play()
}

有没有人遇到类似的东西?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

听起来您需要在.playing = true上设置SCNView

来自docs

  

如果此属性的值为NO(默认值),则SceneKit不会   增加场景时间,以便与场景相关联的动画   不玩。将此属性的值更改为YES以开始设置动画   场景。

答案 1 :(得分:0)

我没有成功&获取SKVideoNode以在Xcode 7.0或7.1中显示视频。如果我在iPad或iPhone等硬件设备上运行我的代码或其他样本,视频显示正常,但在模拟器上只播放音频。相同的代码在xCode 6.4的模拟器中工作正常。

我有来自Ray Wenderlich的CatNap示例iOS& tvOS游戏教程(iOS 9)&它不会在Xcode 7.1附带的Simulator 9.1中运行。我相信模拟器坏了。已经向Apple提交了一个错误,但在一个月内没有回复。

有没有人拥有SKVideoNode的示例代码,可以在xCode 7.1中的模拟器上运行?

答案 2 :(得分:0)

我还发现,在渲染器(例如scnView)上将rendersContinously设置为true可以播放视频。

如果您记录了SCNRendererDelegate的{​​{1}}通话,则可以看到绘制帧的时间