palle-k / GVRSCNRenderer

SceneKit Rendering and ARKit 6DOF Tracking for Google Cardboard
MIT License
22 stars 1 forks source link

SCNRenderer not rendering the AVPlayer #2

Open sasikumar-mobiotics opened 3 years ago

sasikumar-mobiotics commented 3 years ago

When we use AVPlayer in the scenekit, that is not rendering. Just audio only playing.

If you have any solution please let me know.

palle-k commented 3 years ago

Hi, can you share some example code?

sasikumar-mobiotics commented 3 years ago

Thanks for your quick response, Please find the below sample code.

import UIKit
import GVRKit
import GVRSCNRenderer
import SceneKit
import AVKit
import CoreMotion
import GLKit
import SpriteKit

class VRViewController: UIViewController {

    @IBOutlet weak var rendererView: UIView!
    var player: AVPlayer?
    var playerObserver: NSKeyValueObservation?
    var scene: SCNScene!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        guard let scene = SCNScene(named: "room-preset.scn") else { return  }
        self.scene = scene
        let renderer = GVRSCNRenderer(scene: scene)
        renderer.pause(false)
        renderer.rendererDelegate = self
        //        renderer.vrModeEnabled = true
        let view = GVRRendererView(renderer: renderer)
        //        view?.vrModeEnabled = true
        view?.paused = false
        view?.translatesAutoresizingMaskIntoConstraints = false
        view?.frame = rendererView.bounds
        rendererView.addSubview(view!)
        NSLayoutConstraint(item: view!, attribute: .leading, relatedBy: .equal, toItem: rendererView, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: view!, attribute: .trailing, relatedBy: .equal, toItem: rendererView, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: view!, attribute: .top, relatedBy: .equal, toItem: rendererView, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
        NSLayoutConstraint(item: view!, attribute: .bottom, relatedBy: .equal, toItem: rendererView, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
    }
    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return .landscapeLeft
    }
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscapeLeft
    }
    override var shouldAutorotate: Bool {
        return true
    }
    func startNewPlayer() {
        if player != nil {
            return
        }
        let asset = AVURLAsset(url: URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!)
        let playerItem = AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: [#keyPath(AVAsset.tracks), #keyPath(AVAsset.duration)])
        player = AVPlayer(playerItem: playerItem)
        playerObserver = playerItem.observe(\.status, options:  [.new, .old], changeHandler: {[weak self] (playerItem, change) in
            guard let strongSelf = self else {return}
            if playerItem.status == .readyToPlay {
                strongSelf.playerObserver?.invalidate()
                strongSelf.playerObserver = nil
                let videoSize = playerItem.asset.tracks(withMediaType: .video).first?.naturalSize ?? CGSize(width: 640, height: 480)
                var videoNode: SKVideoNode!
                let videoScene = SKScene(size:videoSize)
                videoNode = SKVideoNode(avPlayer: strongSelf.player!)
                videoNode.position = CGPoint(x: videoScene.size.width/2, y: videoScene.size.height/2)
                videoNode.size = videoScene.size
                videoNode.yScale = -1
                videoNode.play()
                videoScene.addChild(videoNode)
                guard let video = strongSelf.scene.rootNode.childNode(withName: "TVSCREEN", recursively: true) else { return }
                video.geometry?.firstMaterial?.diffuse.contents = videoScene
                video.geometry?.firstMaterial?.isDoubleSided = false
            }
        })
    }
}
extension VRViewController: SCNSceneRendererDelegate {
    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
        startNewPlayer()
    }
}
palle-k commented 3 years ago

Thanks, I will look into it.