我正在和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()
}
}
以上代码发生错误。
如果!sceneView.isNode(videoPlayerNode,insideFrustumOf:sceneView!.pointOfView){
无法转换“ SKVideoNode”类型的值?到预期的参数类型“ SCNNode”
答案 0 :(得分:0)
如果您符合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()
}
}
答案 1 :(得分:0)
尝试一下:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Pause the view's session
sceneView.session.pause()
}