在 SceneKit 中使用 MPMoviePlayerController 作为纹理



我在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")
    }
}

任何想法如何解决这种跳帧以及为什么会发生?多谢

我打开了一个关于AVPlayerLayer不能作为SceneKit纹理工作的雷达(在设备上...在模拟器上工作!苹果很友好地回复说,这正在按预期工作,并提供了一个替代方案:

AVPlayerLayer 在设备上呈现在进程之外,不能用作纹理。请改用SKVideoNode。

在最新版本的 SceneKit 中,可以直接将AVPlayer设置为SCNMaterialProperty实例的内容。

最新更新