如何确保一次只播放一个视频?

问题描述 投票:0回答:1

我创建了一个 AR 应用程序,可以在特定图像锚点上播放视频。我想扩展该应用程序以处理超过 1 个图像。现在,当我扫描第一张图像时,它会播放视频,当我扫描第二张图像时,它会播放另一个视频。这里出现的问题是两个视频同时播放。

代码:

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)
         
     }

我尝试使用 2 个 if 条件来帮助在特定图像锚点上播放视频。现在,当我扫描第一张图像时,它会播放视频,当我扫描第二张图像时,它会播放另一个视频。这里出现的问题是两个视频同时播放。我希望每当我播放另一个视频时,第一个视频应该自动停止。

ios swift xcode if-statement augmented-reality
1个回答
0
投票

这里有一些建议,可以帮助您获得您想要的并改进您的代码。

  • 不要为每个图像重复代码,而是创建一个执行所有这些操作的函数。

  • 跟踪当前正在播放的歌曲,以便您可以停止它。

我不熟悉这些 API,但你会得到这样的信息:

class Player
{
    private let rootNode = SCNNode()
    private var playingNode: SCNNode?

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor)
    {
        if let imageAnchor = anchor as? ARImageAnchor
        {
            if let newNode = playVideo(names: imageAnchor.referenceImage.name)
            {
                <inset code to stop playing 'playingNode' and remove it>

                playingNode = newNode
            }
        }
    }

    private func playVideo(named name: String) -> SCNNode?
    {
        guard <check if video file with 'name' exists> else { return nil }

        let videoNode = SKVideoNode(fileNamed: "\(name).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

        return planeNode
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.