2015-04-22 78 views
2

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

任何想法如何解決這個框架跳躍,爲什麼會發生?非常感謝

+0

'MPMoviePlayerController'似乎是一種將視頻內容紋理映射到SceneKit內容的奇怪方式。你有沒有試過'AVPlayerLayer'或'SKVideoNode'? – rickster

+0

另外,如果您期望立方體在所有六個面上都具有相同的內容,那麼最好爲整個立方體使用單一材質,而不是同一材質的六個副本。 – rickster

+0

@ rickster感謝您的建議。我剛剛用AVPlayerLayer而不是MPMoviePlayerController試過,結果是一樣的。我開始認爲它可能是模擬器的行爲,不幸的是我沒有ios8設備,我會在家中檢查它。 (順便說一句,是的,我知道立方體/甚至沒有必要有一個循環 - 這只是一個快速測試/,最後我想將它映射到一個球體上,我只是看到它更好在一個立方體上)。 – Fygo

回答

5

我打開了一個radar關於AVPlayerLayer不能用作SceneKit紋理(在設備上......在模擬器上工作!)。 Apple非常友好地回覆說這是按預期工作的,並提供了一種替代方案:

AVPlayerLayer在設備上呈現出過程不能用作紋理。相反,請使用SKVideoNode。