如何使此渲染器功能连续?

Posted

技术标签:

【中文标题】如何使此渲染器功能连续?【英文标题】:How can I make this renderer function continuous? 【发布时间】:2020-05-09 21:04:11 【问题描述】:

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

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

【问题讨论】:

【参考方案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()
        
    

希望这对你有帮助。

【讨论】:

以上是关于如何使此渲染器功能连续?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:渲染到 FBO 时是不是支持纹理组合器功能?

Hexo选择更高级的Markdown渲染器

EXTJS 6网格列渲染器功能 - 您在哪里定义它?

如何在 ExtJS 中按列类型设置默认列渲染器?

用JS自制表格软件玩数据3. 从零构建实时渲染器

第 n 个子选择器在反应地图渲染功能中不起作用