Как я могу сделать эту функцию рендерера непрерывной?

Здравствуйте, я работаю с камерой AR, и как только камера идентифицирует привязанное изображение, она воспроизводит видео. Как только видео заканчивает воспроизведение и возвращается обратно в камеру, я снова просматриваю то же привязанное изображение, видео не воспроизводится. Я хочу иметь возможность просматривать изображение и воспроизводить видео как можно больше раз.

Вот моя функция воспроизведения видео.

    func playVideo() {
    guard let videoLink = URL(string: "string") else {
        return
    }
    DispatchQueue.main.async {
        let player = AVPlayer(url: videoLink)
        let controller = AVPlayerViewController()
        controller.player = player
            self.present(controller, animated: true){
               player.play()
           }
        }
}

Вот моя функция распознавания изображения.

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    if let imageAnchor = anchor as? ARImageAnchor{
        switch imageAnchor.name{
        case "image":
            playVideo()
        default:
            break
        }
    }
    return nil
}

Может ли кто-нибудь помочь мне или указать мне правильное направление, чтобы понять это?


person Macklin Thomas    schedule 09.05.2020    source источник


Ответы (2)


Когда AVPlayer завершит представление, он отправит системное уведомление, поэтому вы можете добавить VC в качестве наблюдателя, а когда уведомление будет отправлено в функции, вы можете снова вызвать воспроизведение видео. Это код, добавляющий VC в качестве наблюдателя за уведомлением.

NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: nil)
person Andrea    schedule 09.05.2020
comment
Куда добавить это уведомление? - person Macklin Thomas; 10.05.2020
comment
В viewWIllAppear вы должны добавить этот код и обратите внимание на удаление наблюдателя в представленииWillDisappear. - person Andrea; 10.05.2020
comment
переопределить func viewWillAppear (_ анимированный: Bool) { super.viewWillAppear (анимированный) NotificationCenter.default.addObserver (я, селектор: # selector (playVideo), имя: .AVPlayerItemDidPlayToEndTime, объект: nil) пусть конфигурация = ARImageTrackingConfiguration(), если разрешено отслеживать изображения = ARReferenceImage.referenceImages(inGroupNamed: , bundle: Bundle.main) {configuration.trackingImages = trackedImages} sceneView.session.run(configuration)} - person Macklin Thomas; 10.05.2020
comment
Это моя функция viewWillAppear. - person Macklin Thomas; 10.05.2020

Сначала вам нужно создать объект «SKVideoNode».

videoNode = SKVideoNode(avPlayer: videoPlayer)

Затем вы можете воспроизвести видео, используя приведенный ниже код.

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

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

        if imageAnchor.isTracked {
            videoNode.play()
        }
    }

Надеюсь, это будет полезно для вас.

person a.palo    schedule 09.05.2020