【问题标题】:How can I make this renderer function continuous?如何使此渲染器功能连续?
【发布时间】:2024-05-22 00:00:02
【问题描述】:

您好,我正在使用 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
}

有人可以帮助我或指出正确的方向来解决这个问题吗?

【问题讨论】:

    标签: ios swift avfoundation avkit


    【解决方案1】:

    当 AVPlayer 完成呈现时发送系统通知,因此您可以将 VC 添加为观察者,当通知将在函数中发送时,您可以再次调用视频播放。 这是添加VC作为通知观察者的代码

    NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: nil)
    

    【讨论】:

    • 我应该在哪里添加这个通知?
    • 要在viewWIllAppear中添加这段代码,注意去掉viewWillDisappear中的观察者
    • override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(playVideo), name: .AVPlayerItemDidPlayToEndTime, object: nil) 让configuration = ARImageTrackingConfiguration() if let trackedImages = ARReferenceImage.referenceImages(inGroupNamed: "", bundle: Bundle.main){ configuration.trackingImages = trackedImages } sceneView.session.run(configuration) }
    • 这是我的 viewWillAppear 函数。
    【解决方案2】:

    首先你需要创建一个“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()
            }
        }
    

    希望这对你有帮助。

    【讨论】: