ARKit: остановить AVPlayer Audio, когда его не видно - PullRequest
1 голос
/ 22 февраля 2020

Я работаю над приложением ARKit Image Tracking, которое накладывает видео AVPlayer на изображение Target (Swift5 и XCode 13). В настоящее время он настроен на отслеживание только одного изображения одновременно, но в моей эталонной группе AR есть несколько целевых изображений с уникальными видео.

Все это работает нормально, за исключением одной проблемы - звук каждого видео продолжает воспроизводить, даже если видео больше не отслеживается и не воспроизводится камерой AR. Звук даже продолжает воспроизводиться, если пользователь переходит к другому контроллеру представления в приложении.

Как я могу остановить 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

Спасибо за любую помощь !!

1 Ответ

0 голосов
/ 23 февраля 2020
  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()
      }
    }
    
...