在SceneKit中使用MPMoviePlayerController作为纹理

时间:2015-04-22 18:07:03

标签: ios swift video textures scenekit

我在scenekit中创建了一个多维数据集,并尝试使用MPMoviePlayerController的实例作为其材质。它很有用,但效果不是很好:视频看起来很跳跃,就好像它会在视频帧之间跳跃(基本上是从开始到最后一点播放的帧重放)。声音还可以。

我对正在发生的事情做了一个简短的屏幕截图,我想从视频中可以看出这一点:Youtube vid

这是处理多维数据集映射和播放器创建的代码:

var moviePlayer: MPMoviePlayerController?

func startPlayingVideo(){
    let mainBundle = NSBundle.mainBundle()
    let url = mainBundle.URLForResource("Sample", withExtension: "m4v")
    moviePlayer = MPMoviePlayerController(contentURL: url)

    if let player = moviePlayer{
        /* Listen for the notification that the movie player sends us whenever it finishes playing */
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoHasFinishedPlaying:", name: MPMoviePlayerPlaybackDidFinishNotification, object: nil)
        println("Successfully instantiated the movie player")
        player.scalingMode = .AspectFit

        var materials = [SCNMaterial]()
        for i in 1...6 {
            let material = SCNMaterial()
            material.diffuse.contents = player.view.layer
            player.view.frame = CGRectMake(0, 0, 200, 200)
            materials.append(material)
        }
        boxGeometry.materials = materials

        player.controlStyle = MPMovieControlStyle.None
        player.play()
    }
    else {
        println("Failed to instantiate the movie player")
    }
}

任何想法如何解决这种跳帧及其发生的原因?非常感谢

2 个答案:

答案 0 :(得分:7)

我打开了radar关于AVPlayerLayer不能用作SceneKit纹理(在设备上......在模拟器上工作!)。 Apple很友好地回答说这是按预期工作的,并提供了另一种选择:

  

AVPlayerLayer在设备上被渲染出来,不能用作纹理。请改为使用SKVideoNode。

答案 1 :(得分:0)

在最新版本的SceneKit中,您可以直接将with open('filename') as f: array2d = [[int(c,16) for c in line.rstrip()] for line in f] 设置为setState(() { widget.item.isCompleted = newValue; }); 实例的内容。