gpt4 book ai didi

swift - ARKit 如何在失去跟踪时暂停视频

转载 作者:行者123 更新时间:2023-11-30 10:48:24 24 4
gpt4 key购买 nike

我正在使用 ARKit 将视频放在跟踪的图像上。

问题是,当我不跟踪图像时,视频仍然播放,并且声音也播放。

当我不跟踪图像时,有什么方法可以暂停视频吗?

func setupVideoOnNode(_ node: SCNNode, fromURL url: URL){


var videoPlayerNode: SKVideoNode!
let videoPlayer = AVPlayer(url: url)

videoPlayerNode = SKVideoNode(avPlayer: videoPlayer)
videoPlayerNode.yScale = -1

let spriteKitScene = SKScene(size: CGSize(width: 1000, height: 1000))
spriteKitScene.scaleMode = .aspectFit
videoPlayerNode.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
videoPlayerNode.size = spriteKitScene.size
spriteKitScene.addChild(videoPlayerNode)

node.geometry?.firstMaterial?.diffuse.contents = spriteKitScene

videoPlayerNode.play()

}

我怎样才能实现它?

感谢您的帮助。

我在下面添加了当前代码。

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

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

let referenceImage = imageAnchor.referenceImage

let width = CGFloat(referenceImage.physicalSize.width)
let height = CGFloat(referenceImage.physicalSize.height)


let videoHolder = SCNNode()
let videoHolderGeometry = SCNPlane(width: width, height: height)
videoHolder.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
videoHolder.geometry = videoHolderGeometry


if let videoURL = Bundle.main.url(forResource: "img.scnassets/route", withExtension: "MOV"){
setupVideoOnNode(videoHolder, fromURL: videoURL)
}


node.addChildNode(videoHolder)

videoHolder.name = "route"
}


var videoPlayerNode: SKVideoNode?
var videoPlayer: AVPlayer?


func setupVideoOnNode(_ node: SCNNode, fromURL url: URL){

let videoPlayer = AVPlayer(url: url)

videoPlayerNode = SKVideoNode(avPlayer: videoPlayer)
videoPlayerNode?.yScale = -1


let spriteKitScene = SKScene(size: CGSize(width: 1000, height: 1000))
spriteKitScene.scaleMode = .aspectFit
videoPlayerNode?.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
videoPlayerNode?.size = spriteKitScene.size
spriteKitScene.addChild(videoPlayerNode!)


node.geometry?.firstMaterial?.diffuse.contents = spriteKitScene


videoPlayerNode?.play()
videoPlayer.volume = 100

videoPlayer.actionAtItemEnd = AVPlayer.ActionAtItemEnd.none;
NotificationCenter.default.addObserver(self,
selector: #selector(self.stateEnd),
name: NSNotification.Name("AVPlayerItemDidPlayToEndTimeNotification"),
object: videoPlayer.currentItem)

}


@objc func stateEnd(notification: NSNotification) {
let avPlayerItem = notification.object as? AVPlayerItem
avPlayerItem?.seek(to: CMTime.zero)
}

func session(_ session: ARSession, didUpdate frame: ARFrame) {
if !sceneView.isNode(videoPlayerNode, insideFrustumOf: sceneView!.pointOfView) {
videoPlayerNode?.pause()
}
}

上述代码发生错误。

if !sceneView.isNode(videoPlayerNode, insideFrustumOf: sceneView!.pointOfView) {

无法转换“SKVideoNode”类型的值?预期参数类型“SCNNode”

最佳答案

如果您符合ARSessionDelegate,则可以使用func session(ARSession, didUpdate: ARFrame),以及 isNode(_:insideFrustumOf:)检查视频节点是否在帧内,每一帧,如果不在则暂停。

var videoPlayerNode: SKVideoNode?      
var videoPlayer: AVPlayer?

func setupVideoOnNode(_ node: SCNNode, fromURL url: URL){

videoPlayer = AVPlayer(url: url)

videoPlayerNode = SKVideoNode(avPlayer: videoPlayer)
videoPlayerNode?.yScale = -1

let spriteKitScene = SKScene(size: CGSize(width: 1000, height: 1000))
spriteKitScene.scaleMode = .aspectFit
videoPlayerNode?.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
videoPlayerNode?.size = spriteKitScene.size
spriteKitScene.addChild(videoPlayerNode!)

node.geometry?.firstMaterial?.diffuse.contents = spriteKitScene

videoPlayerNode?.play()

}

func session(_ session: ARSession, didUpdate frame: ARFrame) {
if !sceneView.isNode(videoPlayerNode, insideFrustumOf: sceneView!.pointOfView) {
videoPlayerNode?.pause()
}
}

关于swift - ARKit 如何在失去跟踪时暂停视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55281961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com