【问题标题】:ARKit: Stop AVPlayer Audio when not in viewARKit:不在视图中时停止 AVPlayer 音频
【发布时间】:2020-06-06 08:18:32
【问题描述】:

我正在开发一个 ARKit 图像跟踪应用程序,该应用程序将 AVPlayer 视频覆盖在图像目标(Swift5 和 XCode 13)上。我目前将其设置为仅同时跟踪 1 张图像,但我的 AR 参考组中有多个图像目标具有独特的视频。

这一切都很好,除了一个问题 - 即使 AR 相机不再跟踪和渲染视频,每个视频的音频也会继续播放。如果用户在应用中导航到不同的 View Controller,音频甚至会继续播放。

当图像目标不再被跟踪时,如何停止 AVPlayer Audio?

有很多代码,我不确定需要什么来帮助解决问题(最初不包括所有内容),如果其他信息有用,请告诉我。

以 AVPlayer 为材质设置平面

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

    let node = SCNNode()


    if let imageAnchor = anchor as? ARImageAnchor {

        let size = imageAnchor.referenceImage.physicalSize


        let videoUrl = Bundle.main.url(forResource: "Nine", withExtension: "mp4")!
        let videoPlayer = AVPlayer(url: videoUrl)
        videoPlayer.play()
        let plane = SCNPlane(width: size.width, height: size.height)
        plane.firstMaterial?.diffuse.contents = videoPlayer
        let planeNode = SCNNode(geometry: plane)
        planeNode.eulerAngles.x = -.pi / 2
    }

    node.addChildNode(planeNode)
}

return node

感谢您的帮助!!

【问题讨论】:

    标签: swift xcode scenekit avplayer arkit


    【解决方案1】:
    1. 存储videoPlayer

      var videoPlayer: AVPlayer?    
      
      func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        let node = SCNNode()
        if let imageAnchor = anchor as? ARImageAnchor {
        ...
        let videoUrl = Bundle.main.url(forResource: "Nine", withExtension: "mp4")!
        let videoPlayer = AVPlayer(url: videoUrl)
        videoPlayer.play()
        self.videoPlayer = videoPlayer 
        ...
        }
      }
      
    2. 检查当前帧是否有任何图像锚点,如果没有则暂停视频。

      func session(_ session: ARSession, didUpdate frame: ARFrame) {
        if frame.anchors.filter({$0 is ARImageAnchor}).count == 0 {
          videoPlayer?.pause()
        }
      }
      

    【讨论】:

      【解决方案2】:

      当锚点不再被跟踪时,有一种更简单的方法可以停止视频和音频。您需要使用 sceneView.session.remove() 删除 didUpdate() 中的节点。这样做:

       
          func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
      
              if node.isHidden == true {
                  if let imageAnchor = anchor as? ARImageAnchor {
                      sceneView.session.remove(anchor: imageAnchor)
                      player.pause()
                  }
              } else {
                  player.play()
              }
          }
      
      

      您还需要在锚点看不见时暂停播放器,否则音频会继续播放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        • 2021-06-23
        相关资源
        最近更新 更多