【问题标题】:I have a String Error for local path video for AVPlayer我对 AVPlayer 的本地路径视频有一个字符串错误
【发布时间】:2019-06-06 11:30:12
【问题描述】:

我有一个本地视频文件到 AVPlayer 的字符串错误

videoItem 的底线用

标记

可选类型“字符串?”的值必须解包为类型的值 '字符串'

非常感谢您对此的帮助!

当我禁用页面代码的某些位时,我可以让其中一个跟踪图像识别正常,但我无法让它们在同一个版本中被识别。

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

        let node = SCNNode()



       if let imageAnchor = anchor as? ARImageAnchor {


            let fileString = Bundle.main.path(forResource: "black", ofType: "mp4")

            let videoItem = AVPlayerItem(url: URL(fileURLWithPath: fileString))

完整代码在这里

import UIKit
import SceneKit
import ARKit



class ThirdViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    var FreemensNode: SCNNode?
    var VideoNode: SCNNode?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set the view's delegate
        sceneView.delegate = self
        sceneView.autoenablesDefaultLighting = true


        let FreemensScene = SCNScene(named: "ar.scnassets/Freemens.scn")
        let VideoScene = SCNScene(named: "ar.scnassets/Video.scn")
        FreemensNode = FreemensScene?.rootNode
        VideoNode = VideoScene?.rootNode




    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let configuration = ARImageTrackingConfiguration()


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

        configuration.trackingImages = trackingImages
        configuration.maximumNumberOfTrackedImages = 2

        }

        // Run the view's session
        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()



       if let imageAnchor = anchor as? ARImageAnchor {


        if let fileString = Bundle.main.path(forResource: "black", ofType: "mp4") {
            let videoItem = AVPlayerItem(url: URL(fileURLWithPath: fileString))


            let player = AVPlayer(playerItem: videoItem)
            //initialize video node with avplayer
            let videoNode = SKVideoNode(avPlayer: player)

            player.play()
            // add observer when our player.currentItem finishes player, then start playing from the beginning
            NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil) { (notification) in
                player.seek(to: CMTime.zero)
                player.play()
                print("Looping Video")
            }

            // set the size (just a rough one will do)
            let videoScene = SKScene(size: CGSize(width: 480, height: 360))
            // center our video to the size of our video scene
            videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)
            // invert our video so it does not look upside down
            videoNode.yScale = -1.0
            // add the video to our scene
            videoScene.addChild(videoNode)


            // Create a plane
            let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
            if imageAnchor.referenceImage.name == "Tracker" {
                // Set AVPlayer as the plane's texture and play
            plane.firstMaterial?.diffuse.contents = videoScene

            } else if imageAnchor.referenceImage.name == "Vuforia" {
               plane.firstMaterial?.diffuse.contents = UIColor(white: 1, alpha: 0.0)


            let planeNode = SCNNode(geometry: plane)
            planeNode.eulerAngles.x = -.pi / 2
            node.addChildNode(planeNode)

            }

            var shapeNode: SCNNode?
            switch imageAnchor.referenceImage.name {
            case ArItem.Freemens.rawValue :
                shapeNode = FreemensNode

            case ArItem.Video.rawValue :
                shapeNode = VideoNode
            default:
                break

            }



            if imageAnchor.referenceImage.name == "Vuforia" {
                 shapeNode = FreemensNode


            } else if imageAnchor.referenceImage.name == "Tracker"{
                shapeNode = VideoNode



            }

            guard let shape = shapeNode else { return nil}
            node.addChildNode(shape)
        }

        return node

    }

    enum ArItem : String {
        case Freemens = "Freemens"
        case Video = "Video"
    }

}


}

【问题讨论】:

    标签: ios swift string xcode avplayer


    【解决方案1】:

    编译器错误,

    可选类型“字符串?”的值必须解包为类型的值 '字符串'

    原因:

    path(forResource:ofType:) 返回一个String?。因此,fileString 的类型为 String?

    解决方案:

    所以,在AVPlayerItem(url:) 中使用它之前,您需要先unwrap 它,

    if let fileString = Bundle.main.path(forResource: "black", ofType: "mp4") {
        let videoItem = AVPlayerItem(url: URL(fileURLWithPath: fileString))
    }
    

    编辑:

    你需要 return nodenil 来自 renderer(_:, nodeFor:) 方法。

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        let node = SCNNode()
        if let imageAnchor = anchor as? ARImageAnchor {            
            if let fileString = Bundle.main.path(forResource: "black", ofType: "mp4") {
                let videoItem = AVPlayerItem(url: URL(fileURLWithPath: fileString))
            }
            return node
        }
        .
        .
        .
        return nil //here.....
    }
    

    Edit-2:

    在您的代码中,在您创建的enum 之后添加return nil 语句,即

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        //Your code here...
        enum ArItem : String {
            case Freemens = "Freemens"
            case Video = "Video"
        }
        return nil //Here.............
    }
    

    【讨论】:

    • 非常感谢您回复@PGDev,我已经这样做了,但是现在它导致了一个我不明白的错误
    • code在预期返回 'SCNNode?'的函数中缺少返回值?code
    • 你需要从renderer(_:, nodeFor:)方法返回nodenil。
    • 在枚举定义结束后添加return nil
    • 您好 PGDev,它不是。我试图将整页代码粘贴到评论中,但它不允许我这样做。有没有其他方法可以发给你。
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 2013-04-04
    • 1970-01-01
    • 2021-04-01
    • 2013-07-02
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多