Ios 在ARKit上使用YoutubePlayerView

Ios 在ARKit上使用YoutubePlayerView,ios,swift,video,augmented-reality,arkit,Ios,Swift,Video,Augmented Reality,Arkit,我正在开发ARKit应用程序,在该应用程序中,我检测平面图,并使用pod将YouTube视频添加到平面图上。我设法探测到了表面并添加了YouTubePlayerView 播放YourTube视频中的音频,但不显示视频 任何人都可能面临同样的问题 下面是我的代码 import UIKit import SceneKit import ARKit import YoutubePlayerView   class ViewController: UIVi

我正在开发ARKit应用程序,在该应用程序中,我检测平面图,并使用pod将YouTube视频添加到平面图上。我设法探测到了表面并添加了YouTubePlayerView

播放YourTube视频中的音频,但不显示视频

任何人都可能面临同样的问题

下面是我的代码

    import UIKit
    import SceneKit
    import ARKit
    import YoutubePlayerView
     
    class ViewController: UIViewController, ARSCNViewDelegate {
     
    @IBOutlet var sceneView: ARSCNView!
    let videoPlayerNode = SCNNode()
     
        override func viewDidLoad() {
            super.viewDidLoad()
            // Set the view's delegate
            sceneView.delegate = self
     
            // Show statistics such as fps and timing information
            sceneView.showsStatistics = true
        }
     
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
     
            // Create a session configuration
            let configuration = ARWorldTrackingConfiguration()
     
            // Enable horizontal plane detection
            configuration.planeDetection = .horizontal
     
            // show Feature Points
            sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
     
            // Run the view's session
            sceneView.session.run(configuration)
        }
     
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
     
            // Pause the view's session
            sceneView.session.pause()
        }
     
        func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
     
            if let planeAnchor = anchor as? ARPlaneAnchor {
     
            let videoPlayerGeometry = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z))
     
            DispatchQueue.main.async {
                let playerView = YoutubePlayerView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
                let playerVars: [String: Any] = [
                                    "controls": 1,
                                    "modestbranding": 1,
                                    "playsinline": 1,
                                    "autoplay": 1,
                                    "origin": "https://youtube.com"
                ]
                playerView.delegate = self
                playerView.loadWithVideoId("w277oTvoKAM", with: playerVars) // CdXesX6mYUE

                videoPlayerGeometry.firstMaterial?.diffuse.contents = playerView
                self.videoPlayerNode.geometry = videoPlayerGeometry
                self.videoPlayerNode.eulerAngles.x = -.pi / 2
                node.addChildNode(self.videoPlayerNode)
                }
            }
        }
    }
     
     
    extension ViewController: YoutubePlayerViewDelegate {
        func playerViewDidBecomeReady(_ playerView: YoutubePlayerView) {
            print("Ready")
            playerView.fetchPlayerState { (state) in
            print("Fetch Player State: \(state)")
        }
     
        func playerView(_ playerView: YoutubePlayerView, didChangedToState state: YoutubePlayerState) {
            print("Changed to state: \(state)")
        }
     
        func playerView(_ playerView: YoutubePlayerView, didChangeToQuality quality: YoutubePlaybackQuality) {
            print("Changed to quality: \(quality)")
        }
     
        func playerView(_ playerView: YoutubePlayerView, receivedError error: Error) {
            print("Error: \(error)")
        }
     
        func playerView(_ playerView: YoutubePlayerView, didPlayTime time: Float) {
            print("Play time: \(time)")
        }
     
        func playerViewPreferredInitialLoadingView(_ playerView: YoutubePlayerView) -> UIView? {
            let view = UIView()
            view.backgroundColor = .red
            return view
        }
    }


谢谢

主要问题是使用
UIView
而不是使用SpriteKit的场景或AVPlayer:

videoPlayerGeometry.firstMaterial?.diffuse.contents = skScene
或:

以下是
.contents
实例属性的可能候选项:

  • NSColor/UIColor/CGColor
  • NSNumber
  • NSImage/UIImage/CGImage
  • AVPlayer中的NSString或NSURL对象
  • 加莱尔
  • SKTexture/MDLTexture/MTLTexture
  • 精灵场景
  • 六幅图像的特殊格式数组的立方体映射
您的网址中也遗漏了
/watch?v=

let playerVars: [String: Any] = [ "controls" : 1,
                                  "modestbranding" : 1,
                                  "playsinline" : 1,
                                  "autoplay" : 1,
                                  "origin" : "https://www.youtube.com/embed/"
                                ]

playerView.loadWithVideoId("w277oTvoKAM", with: playerVars)
如果不起作用,请尝试
https://www.youtube.com/embed/w277oTvoKAM

另外,全局声明您的
playerView
属性。并将
playerView.delegate
放入
viewDidLoad()中
方法:

override func viewDidLoad() {
    super.viewDidLoad()

    sceneView.delegate = self
    playerView.delegate = self   // a delegate for using playerView() methods
}
p.S.

在ARKit应用程序中将
视频作为纹理播放的常规方法不适用于YouTube视频。但是,如果您对这种方法感兴趣,我将在这里编写它(了解如何填充纹理):


YouTube视频正在
WKWebView
中播放,但它是二维的。使其在3D几何体上工作是一项挑战。

主要问题是使用
UIView
而不是使用SpriteKit的场景或AVPlayer:

videoPlayerGeometry.firstMaterial?.diffuse.contents = skScene
或:

以下是
.contents
实例属性的可能候选项:

  • NSColor/UIColor/CGColor
  • NSNumber
  • NSImage/UIImage/CGImage
  • AVPlayer中的NSString或NSURL对象
  • 加莱尔
  • SKTexture/MDLTexture/MTLTexture
  • 精灵场景
  • 六幅图像的特殊格式数组的立方体映射
您的网址中也遗漏了
/watch?v=

let playerVars: [String: Any] = [ "controls" : 1,
                                  "modestbranding" : 1,
                                  "playsinline" : 1,
                                  "autoplay" : 1,
                                  "origin" : "https://www.youtube.com/embed/"
                                ]

playerView.loadWithVideoId("w277oTvoKAM", with: playerVars)
如果不起作用,请尝试
https://www.youtube.com/embed/w277oTvoKAM

另外,全局声明您的
playerView
属性。并将
playerView.delegate
放入
viewDidLoad()中
方法:

override func viewDidLoad() {
    super.viewDidLoad()

    sceneView.delegate = self
    playerView.delegate = self   // a delegate for using playerView() methods
}
p.S.

在ARKit应用程序中将
视频作为纹理播放的常规方法不适用于YouTube视频。但是,如果您对这种方法感兴趣,我将在这里编写它(了解如何填充纹理):


YouTube视频正在
WKWebView
中播放,但它是二维的。要使其在3D几何图形上工作是一项挑战。

感谢您的回复,我尝试按照您的建议进行更改。但现在它不能播放音频了。它只显示红色平面,而不是黑色平面。我的案子会少什么?任何建议。添加。没有成功!还是一样。你用
https://www.youtube.com/watch?v=w277oTvoKAM
url with
www
?尝试了两者:有www和无www。1)和2)感谢您的回复,我尝试了按照您的建议进行更改。但现在它不能播放音频了。它只显示红色平面,而不是黑色平面。我的案子会少什么?任何建议。添加。没有成功!还是一样。你用
https://www.youtube.com/watch?v=w277oTvoKAM
url和
www
?尝试了两种方法:带www和不带www。1)和2)