ARKit在无法跟踪时如何暂停视频

时间:2019-03-21 13:50:13

标签: swift arkit

我正在和ARKit玩,将视频放在跟踪的图像上。

问题是当我不跟踪图像时,视频仍在播放,声音也在播放。

当我不跟踪图像时,是否可以暂停视频?

func setupVideoOnNode(_ node: SCNNode, fromURL url: URL){


    var videoPlayerNode: SKVideoNode!      
    let videoPlayer = AVPlayer(url: url)

    videoPlayerNode = SKVideoNode(avPlayer: videoPlayer)
    videoPlayerNode.yScale = -1       

    let spriteKitScene = SKScene(size: CGSize(width: 1000, height: 1000))
    spriteKitScene.scaleMode = .aspectFit
    videoPlayerNode.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
    videoPlayerNode.size = spriteKitScene.size
    spriteKitScene.addChild(videoPlayerNode)

    node.geometry?.firstMaterial?.diffuse.contents = spriteKitScene

    videoPlayerNode.play()

}

我该如何实现?

谢谢您的帮助。

我在下面添加了当前代码。

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    guard let imageAnchor = anchor as? ARImageAnchor else { return }

    let referenceImage = imageAnchor.referenceImage

    let width = CGFloat(referenceImage.physicalSize.width)
    let height = CGFloat(referenceImage.physicalSize.height)


    let videoHolder = SCNNode()
    let videoHolderGeometry = SCNPlane(width: width, height: height)
    videoHolder.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
    videoHolder.geometry = videoHolderGeometry


    if let videoURL = Bundle.main.url(forResource: "img.scnassets/route", withExtension: "MOV"){
        setupVideoOnNode(videoHolder, fromURL: videoURL)
    }


    node.addChildNode(videoHolder)

    videoHolder.name = "route"
}


var videoPlayerNode: SKVideoNode?
var videoPlayer: AVPlayer?


func setupVideoOnNode(_ node: SCNNode, fromURL url: URL){

    let videoPlayer = AVPlayer(url: url)

    videoPlayerNode = SKVideoNode(avPlayer: videoPlayer)
    videoPlayerNode?.yScale = -1


    let spriteKitScene = SKScene(size: CGSize(width: 1000, height: 1000))
    spriteKitScene.scaleMode = .aspectFit
    videoPlayerNode?.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
    videoPlayerNode?.size = spriteKitScene.size
    spriteKitScene.addChild(videoPlayerNode!)


    node.geometry?.firstMaterial?.diffuse.contents = spriteKitScene


    videoPlayerNode?.play()
    videoPlayer.volume = 100

    videoPlayer.actionAtItemEnd = AVPlayer.ActionAtItemEnd.none;
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(self.stateEnd),
                                           name: NSNotification.Name("AVPlayerItemDidPlayToEndTimeNotification"),
                                           object: videoPlayer.currentItem)

}


@objc func stateEnd(notification: NSNotification) {
    let avPlayerItem = notification.object as? AVPlayerItem
    avPlayerItem?.seek(to: CMTime.zero)
}

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    if !sceneView.isNode(videoPlayerNode, insideFrustumOf: sceneView!.pointOfView) {
        videoPlayerNode?.pause()
    }
}

以上代码发生错误。

如果!sceneView.isNode(videoPlayerNode,insideFrustumOf:sceneView!.pointOfView){

无法转换“ SKVideoNode”类型的值?到预期的参数类型“ SCNNode”

2 个答案:

答案 0 :(得分:0)

如果您符合ARSessionDelegate,则可以使用func session(ARSession, didUpdate: ARFrame) ,连同isNode(_:insideFrustumOf:)一起检查视频节点是否在帧中,每帧,如果没有,则暂停。

var videoPlayerNode: SKVideoNode?      
var videoPlayer: AVPlayer?

func setupVideoOnNode(_ node: SCNNode, fromURL url: URL){

    videoPlayer = AVPlayer(url: url)

    videoPlayerNode = SKVideoNode(avPlayer: videoPlayer)
    videoPlayerNode?.yScale = -1       

    let spriteKitScene = SKScene(size: CGSize(width: 1000, height: 1000))
    spriteKitScene.scaleMode = .aspectFit
    videoPlayerNode?.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
    videoPlayerNode?.size = spriteKitScene.size
    spriteKitScene.addChild(videoPlayerNode!)

    node.geometry?.firstMaterial?.diffuse.contents = spriteKitScene

    videoPlayerNode?.play()

}

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    if !sceneView.isNode(videoPlayerNode, insideFrustumOf: sceneView!.pointOfView) {
        videoPlayerNode?.pause()
    }
}

答案 1 :(得分:0)

尝试一下:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Pause the view's session
    sceneView.session.pause()
}
相关问题