如何使此渲染器功能连续?
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()
希望这对你有帮助。
【讨论】:
以上是关于如何使此渲染器功能连续?的主要内容,如果未能解决你的问题,请参考以下文章