How to make sure that only one video will be played at a time?

Hello there, I created an AR App that plays a video on a particular image anchor. I wanted to extend that application to deal with more than 1 image. Now when I scan 1st image it plays the video, and when I scan the 2nd image it plays another video. The Problem that occurs here is both videos are playing simultaneously.

The Code:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

    let node = SCNNode()
    
    if let imageAnchor = anchor as? ARImageAnchor {
        
        //below code needs to be duplicated in order to add more news
        
        if imageAnchor.referenceImage.name == "harrypotter" {
            
            let videoNode = SKVideoNode(fileNamed: "harrypotter.mp4")
            
            videoNode.play()
            
            let videoScene = SKScene(size: CGSize(width: 480, height: 360))
            
            videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)
            
            videoNode.yScale = -1.0
            
            videoScene.addChild(videoNode)
            
            
            let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
            
            plane.firstMaterial?.diffuse.contents = videoScene
            
            let planeNode = SCNNode(geometry: plane)
            
            planeNode.eulerAngles.x = -.pi / 2
            
            node.addChildNode(planeNode)
            
        }

        if imageAnchor.referenceImage.name == "deatheater" {
         
         let videoNode = SKVideoNode(fileNamed: "deatheater.mp4")
            
            videoNode.play()
         
         let videoScene = SKScene(size: CGSize(width: 480, height: 360))
         
         videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)
         
         videoNode.yScale = -1.0
         
         videoScene.addChild(videoNode)
         
         
         let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
         
         plane.firstMaterial?.diffuse.contents = videoScene
         
         let planeNode = SCNNode(geometry: plane)
         
         planeNode.eulerAngles.x = -.pi / 2
         
         node.addChildNode(planeNode)
         
     }
Answered by ankurbatta in 744883022

found the solution

 func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {     let node = SCNNode()           if let imageAnchor = anchor as? ARImageAnchor {       let videos = ["harrypotter": "harrypotter.mp4", "deatheater": "deatheater.mp4"]               if let videoName = videos[imageAnchor.referenceImage.name!] {         if let currentVideoNode = currentVideoNode {           currentVideoNode.pause()           currentVideoNode.removeFromParent()         }                   let videoNode = SKVideoNode(fileNamed: videoName)         videoNode.play()         currentVideoNode = videoNode                   let videoScene = SKScene(size: CGSize(width: 480, height: 360))         videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)         videoNode.yScale = -1.0         videoScene.addChild(videoNode)                   let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)         plane.firstMaterial?.diffuse.contents = videoScene                   let planeNode = SCNNode(geometry: plane)         planeNode.eulerAngles.x = -.pi / 2                   node.addChildNode(planeNode)       }     }           return node   } }

Accepted Answer

found the solution

 func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {     let node = SCNNode()           if let imageAnchor = anchor as? ARImageAnchor {       let videos = ["harrypotter": "harrypotter.mp4", "deatheater": "deatheater.mp4"]               if let videoName = videos[imageAnchor.referenceImage.name!] {         if let currentVideoNode = currentVideoNode {           currentVideoNode.pause()           currentVideoNode.removeFromParent()         }                   let videoNode = SKVideoNode(fileNamed: videoName)         videoNode.play()         currentVideoNode = videoNode                   let videoScene = SKScene(size: CGSize(width: 480, height: 360))         videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)         videoNode.yScale = -1.0         videoScene.addChild(videoNode)                   let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)         plane.firstMaterial?.diffuse.contents = videoScene                   let planeNode = SCNNode(geometry: plane)         planeNode.eulerAngles.x = -.pi / 2                   node.addChildNode(planeNode)       }     }           return node   } }

found the solution...

 func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {     let node = SCNNode()           if let imageAnchor = anchor as? ARImageAnchor {       let videos = ["harrypotter": "harrypotter.mp4", "deatheater": "deatheater.mp4"]               if let videoName = videos[imageAnchor.referenceImage.name!] {         if let currentVideoNode = currentVideoNode {           currentVideoNode.pause()           currentVideoNode.removeFromParent()         }                   let videoNode = SKVideoNode(fileNamed: videoName)         videoNode.play()         currentVideoNode = videoNode                   let videoScene = SKScene(size: CGSize(width: 480, height: 360))         videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)         videoNode.yScale = -1.0         videoScene.addChild(videoNode)                   let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)         plane.firstMaterial?.diffuse.contents = videoScene                   let planeNode = SCNNode(geometry: plane)         planeNode.eulerAngles.x = -.pi / 2                   node.addChildNode(planeNode)       }     }           return node   } }

How to make sure that only one video will be played at a time?
 
 
Q