ios - 我的 AVPlayer 的本地路径视频出现字符串错误

标签 ios swift string xcode avplayer

我的 AVPlayer 本地视频文件出现字符串错误

videoItem 的底线用

标记

Value of optional type 'String?' must be unwrapped to a value of type 'String'

非常感谢对此的帮助!

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

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"
    }

}


}

最佳答案

编译器错误,

Value of optional type 'String?' must be unwrapped to a value of type 'String'

原因:

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

解决方案:

因此,在 AVPlayerItem(url:) 中使用它之前,您需要解开它,例如,

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

编辑:

您需要从 renderer(_:, nodeFor:) 方法返回 nodenil

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.....
}

编辑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.............
}

关于ios - 我的 AVPlayer 的本地路径视频出现字符串错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56476673/

相关文章:

ios - iOS NSAttributedString用颜色舍入背景

Swift Guard else 调用具有 NULL 值的字典键

ios - 如何在 iOS 项目中使用 HDR 颜色?

java - 从字符串中提取数字和运算符

ios - 框架架构 : Specify NSBundle to load . 来自单例初始化期间的 plist 文件

ios - 如何使用 iOS sdk 录制设备屏幕视频?

ios - 更改 UIImagePickerController 的 TintColor

c++ - C++ 中的 Char* 与字符串速度

java - 为什么字符串在 Java 中以 ""开头?

ios - 如何在 iTunes 中正确取消支持 iPad