Skip to content

Instantly share code, notes, and snippets.

@gsabran
Last active February 18, 2023 06:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gsabran/0ef8d125bb74391251c46c33d70d05f4 to your computer and use it in GitHub Desktop.
Save gsabran/0ef8d125bb74391251c46c33d70d05f4 to your computer and use it in GitHub Desktop.
Test using AVPlayerLayer as texture input (using Metal / iOS 10)
import UIKit
import SceneKit
import SpriteKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var scnView: SCNView!
var videoLayer: AVPlayerLayer!
var videoPlayer: AVPlayer!
override func viewDidLoad() {
super.viewDidLoad()
setupVideo()
// Do any additional setup after loading the view, typically from a nib.
scnView.showsStatistics = true
scnView.allowsCameraControl = true
let scnScene = SCNScene()
scnView.scene = scnScene
// setup SceneKit scene
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0.0, y: 0.0, z: 25.0)
scnScene.rootNode.addChildNode(cameraNode)
let cubeNode = SCNNode()
cubeNode.geometry = SCNBox(width: 5.0, height: 5.0, length: 5.0, chamferRadius: 0.0)
scnScene.rootNode.addChildNode(cubeNode)
let material = cubeNode.geometry!.firstMaterial!
let tryAVLayer = false // change me!
if tryAVLayer {
material.diffuse.contents = videoLayer // This crashes
} else {
// setup SpriteKit Scene
let skScene = SKScene()
skScene.backgroundColor = UIColor.black
skScene.size = CGSize(width: 100, height: 100)
let skVideoNode = SKVideoNode(avPlayer: videoPlayer)
skVideoNode.size = CGSize(width: 100, height: 100)
skVideoNode.position = CGPoint(x: 50, y: 50)
skScene.addChild(skVideoNode)
material.diffuse.contents = skScene // This works
}
}
func setupVideo() {
let item = AVPlayerItem(url: URL(fileURLWithPath: Bundle.main.path(forResource: "test", ofType: "mp4")!))
let player = AVPlayer(playerItem: item)
let layer = AVPlayerLayer(player: player)
videoLayer = layer
videoPlayer = player
player.play()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment