Ios 在ARKit上使用YoutubePlayerView
我正在开发ARKit应用程序,在该应用程序中,我检测平面图,并使用pod将YouTube视频添加到平面图上。我设法探测到了表面并添加了YouTubePlayerView 播放YourTube视频中的音频,但不显示视频 任何人都可能面临同样的问题 下面是我的代码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
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 withwww
?尝试了两者:有www和无www。1)和2)感谢您的回复,我尝试了按照您的建议进行更改。但现在它不能播放音频了。它只显示红色平面,而不是黑色平面。我的案子会少什么?任何建议。添加。没有成功!还是一样。你用https://www.youtube.com/watch?v=w277oTvoKAM
url和www
?尝试了两种方法:带www和不带www。1)和2)