gpt4 book ai didi

ios - 使用 AVPlayer 对象初始化 SKVideoNode - SWIFT

转载 作者:行者123 更新时间:2023-11-29 05:16:02 25 4
gpt4 key购买 nike

我正在使用 ARKit 并创建了一个应用程序,它将视频内容叠加到识别的图像上。代码如下:

import UIKit
import SceneKit
import ARKit
import SpriteKit

class ViewController: UIViewController, ARSCNViewDelegate {

@IBOutlet var sceneView: ARSCNView!

override func viewDidLoad() {
super.viewDidLoad()

sceneView.delegate = self

}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

let configuration = ARImageTrackingConfiguration()

if let imageToTrack = ARReferenceImage.referenceImages(inGroupNamed: "ALLimages", bundle: Bundle.main) {

configuration.trackingImages = imageToTrack

configuration.maximumNumberOfTrackedImages = 3

print("Images successfully added")

}

sceneView.session.run(configuration)
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)

sceneView.session.pause()
}

// MARK: - ARSCNViewDelegate

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()

var videoNode = SKVideoNode()

var videoScene = SKScene()

if let imageAnchor = anchor as? ARImageAnchor {


videoNode = SKVideoNode(fileNamed: "video1.mp4")

videoNode.play()

videoScene = SKScene(size: CGSize(width: 640, height: 360))

videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)

videoNode.yScale = -1.0

videoScene.addChild(videoNode)

let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)

plane.firstMaterial?.diffuse.contents = videoScene

let planeNode = SCNNode(geometry: plane)

planeNode.eulerAngles.x = -.pi/2

node.addChildNode(planeNode)

}
return node
}
}

这工作完美......一次!但问题是,一旦视频播放完毕,由于 SKVideoNode 可用的控制有限,我无法弄清楚如何自动重新启动视频。理想情况下,这些应该循环播放。

我做了一些研究,似乎最好的方法是使用 AVPlayer 对象初始化我的视频节点。

所以,我尝试这样做,但无法使其正常工作。

我在我的类中添加了 var player = AVPlayer() ,然后尝试按如下方式初始化我的 videoNode:

var videoNode: SKVideoNode? = {
guard let urlString = Bundle.main.path(forResource: "video1", ofType: "mov") else {
return nil
}

let url = URL(fileURLWithPath: urlString)
let item = AVPlayerItem(url: url)
let player = AVPlayer(playerItem: item)

return SKVideoNode(avPlayer: player)
}()

然后我尝试使用player.play(),但视频从未播放。相反,我的飞机只是在图像上显示为空白矩形。

一旦我成功初始化它,我想我可以添加一个观察者来检查视频何时完成播放并重新启动它,但我正在努力达到这一点。

最佳答案

首先,在 SCNNode 中的 SKScene 中不需要 SKVideoNode。您可以直接使用 AVPlayer 作为 SCNNode 的漫反射内容:plane.firstMaterial?.diffuse.contents = 播放器

要循环播放,您必须订阅播放器上的通知,并在结束时将时间重置为零:

NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil) { _ in
player.seek(to: .zero)
player.play()
}

关于ios - 使用 AVPlayer 对象初始化 SKVideoNode - SWIFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59179843/

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