【问题标题】:Swift video on sphere, black screen but can hear audio球体上的快速视频,黑屏,但可以听到音频
【发布时间】:2016-02-11 14:14:31
【问题描述】:

我正在尝试制作一个 360 度视频播放器,方法是将视频投影到球体上,然后将法线从里到外翻转并将相机放在球体内,但是当我尝试播放时出现黑屏球体上的视频,但我可以听到音频播放。

   override func viewDidLoad() {
        super.viewDidLoad()

        //create sphere
        makeSphere();

        //create user-interface
        resizeScreen();

    }

ViewDidLoad ^ 我打电话给resizeScreen();,这会使视频播放器“适应”屏幕。

 //set variables
        var player : AVPlayer? = nil;
        var playerLayer : AVPlayerLayer? = nil;
        var asset : AVAsset? = nil;
        var playerItem : AVPlayerItem? = nil;
        var timer = NSTimer();

        //start functions
        func resizeScreen() {

            //Get device screen width & height
            var screenSize: CGRect = UIScreen.mainScreen().bounds;

            //set screen width and height in variables
            var screenWidth = screenSize.width;
            var screenHeight = screenSize.height;

            //change size of video player
            playerLayer?.frame.size.height = screenHeight * 0.75;
            playerLayer?.frame.size.width = screenWidth * 1.0;

            //change size of button
            PlayVid.frame.size.height = screenHeight * 0.75;
            PlayVid.frame.size.width = screenWidth * 1;

            //set position of text label
            TemporaryURL.center.x = screenWidth * 0.5;
            TemporaryURL.center.y = screenHeight * 0.9

        }

resizeScreen();,如上所述,使视频播放器和按钮适应屏幕大小。

        func makeSphere() {
            let sceneView = SCNView(frame: self.view.frame);
            self.view.addSubview(sceneView);

            //Get device screen width & height
            var screenSize: CGRect = UIScreen.mainScreen().bounds;

            //set screen width and height in variables
            var screenWidth = screenSize.width;
            var screenHeight = screenSize.height;

            //set scene's height, width and x-position
            sceneView.frame.size.height = screenHeight * 0.75;
            sceneView.frame.size.width = screenWidth * 1;
            sceneView.center.x = screenWidth * 0.5;

            //create scene
            let scene = SCNScene();
            sceneView.scene = scene;

            //camera positioning
            let camera = SCNCamera();
            let cameraNode = SCNNode();
            cameraNode.camera = camera;
            cameraNode.position = SCNVector3(x: -3.0, y: 3.0, z: 3.0);

            //lighting
            let light = SCNLight();
            light.type = SCNLightTypeOmni;
            let lightNode = SCNNode();
            lightNode.light = light;
            lightNode.position = SCNVector3(x: 0, y: 0, z: 0);

            //create a sphere
            let sphereGeometry = SCNSphere(radius: 2.5);

            //create sphere node
            let sphereNode = SCNNode(geometry: sphereGeometry);

            //create constraint for sphere
            let constraint = SCNLookAtConstraint(target: sphereNode);
            //constraint.gimbalLockEnabled = true;
            cameraNode.constraints = [constraint];

            //set nodes
            //scene.rootNode.addChildNode(lightNode);
            scene.rootNode.addChildNode(cameraNode);
            scene.rootNode.addChildNode(sphereNode);


             inlineVideo();
             player!.play();

            //make variable
            let videoMaterial = SCNMaterial();
            var imgURL = NSURL(string: "http://imgurl");
            var videoURLWithPath = "http://videourl";
            var videoURL = NSURL(string: videoURLWithPath);

            //apply texture to variable
            videoMaterial.diffuse.contents = AVPlayerLayer(player: self.player);
            videoMaterial.specular.contents = UIColor.redColor();
            videoMaterial.shininess = 1.0;

            //set texture on object of name sphereGeomtetry
            sphereGeometry.materials = [videoMaterial];
        }

makeSphere();这将创建球体并初始化所述球体的视频。

        func inlineVideo(){
            //play inline video

            //insert url of video into textfield
            var PasteBoard = UIPasteboard.generalPasteboard().string;
            TemporaryURL.text = PasteBoard;

            //get path of video
            //var videoURLWithPath = PasteBoard;
            var videoURLWithPath = "http://videourl";
            var videoURL = NSURL(string: videoURLWithPath);

            if (videoURL == nil){
                videoURL = NSURL(string: "http://videourl");
            }else{
                //do nothing
            }

            //get video url & set it
            asset = AVAsset(URL: videoURL!) as AVAsset;
            playerItem = AVPlayerItem(asset:asset!);

            //set target for video
            player = AVPlayer(playerItem: self.playerItem!);
            playerLayer = AVPlayerLayer(player: self.player);
        }

这是我用来初始化常规视频的视频播放器代码,我尝试将 PlayerLayer 绑定到球体的纹理,但我得到的只是黑屏,即使我听到声音,为什么不投影在球体上的视频?我认为这样的事情应该可行吗?

【问题讨论】:

  • @mnuages & 我似乎无法让 SKVideoNode 工作,我一直黑屏,但声音正在播放
  • @mnuages 在第一帧和黑屏之间切换:/
  • SceneKit 中的视频存在一些问题。我认为唯一知道如何使用它的人在法国为 Apple 工作并创建 SceneKit。
  • 我认为这是 iOS YouTube 应用仍然没有兼容 Cardboard 的 360 视频查看器的主要原因。我有一些在这里工作的东西。但似乎有内存泄漏,最终会崩溃:github.com/kosso/simple360player_iOS

标签: ios swift video avplayer scenekit


【解决方案1】:

检查以下链接:

有 3 种不同的方法(例如 OpenGL/SceneKit、着色器/固定功能管道、swift/obj-c、RGB/YCbCr),所以每个人都应该找到任何方便的代码。

【讨论】:

【解决方案2】:

您需要使用SKVideoNode 在球体上显示视频,请参阅SKVideoNode only on a small part of SCNSphere - 仍然是小问题,修复后会更新。

【讨论】:

  • 请注意,在最新版本的 SceneKit 中使用 SKSceneSKVideoNode 是不必要的。您可以直接将AVPlayer 设置为SCNMaterialProperty 实例的内容。
【解决方案3】:

设置播放器并开始播放,然后再将其指定为素材以使其正常工作。

var player = AVPlayer(url: yourURL)
player.play()
node.geo.material.emissive.contents = player

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多