首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AVPlayer对象初始化SKVideoNode - SWIFT

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

Stack Overflow用户
提问于 2019-12-04 23:49:36
回答 1查看 271关注 0票数 0

我正在玩ARKit,并创建了一个应用程序,可以将视频内容覆盖到可识别的图像上。代码如下:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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(),但视频从未播放过。相反,我的飞机只是在我的图像上显示为一个空白矩形。

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

EN

回答 1

Stack Overflow用户

发布于 2019-12-05 00:19:24

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

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

代码语言:javascript
复制
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil) { _ in
    player.seek(to: .zero)
    player.play()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59179843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档