【问题标题】:Using MPMoviePlayerController as texture in SceneKit在 SceneKit 中使用 MPMoviePlayerController 作为纹理
【发布时间】:2015-06-30 14:05:31
【问题描述】:

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

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

【问题讨论】:

  • MPMoviePlayerController 似乎是一种将视频内容纹理映射到 SceneKit 内容的奇怪方式。你试过AVPlayerLayerSKVideoNode吗?
  • 另外,如果您希望立方体在所有六个面上具有相同的内容,那么您最好为整个立方体使用一种材质,而不是使用相同材质的六个副本。
  • @rickster 感谢您的建议。我刚刚用 AVPlayerLayer 而不是 MPMoviePlayerController 尝试过,结果是一样的。我开始认为可能是模拟器出了问题,不幸的是我没有带ios8设备,我会在家里检查一下。 (顺便说一句,是的,我知道立方体/那里甚至没有必要有一个 for 循环 - 这只是一个快速测试/,最后我想将它映射到一个球体上,我只是看得更好在一个立方体上)。
  • 模拟器无法准确描述设备性能,尤其是在涉及视频和 SceneKit 等与 GPU 相关的内容时。
  • @rickster 所以在设备中它根本不起作用......我用球体尝试过 - 只有黑色球体,绿色球体,内存警告(模拟器显示大约 80MB 内存消耗)或球体根本没有出现。

标签: ios swift video textures scenekit


【解决方案1】:

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

AVPlayerLayer 在设备上的进程外渲染,不能用作纹理。请改用 SKVideoNode。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 2014-11-25
      • 2016-07-04
      • 2013-09-09
      • 2016-02-20
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多