SpriteKit SKScene 添加 AVCaptureVideoPreviewLayer CALayer 作为背景不起作用

Posted

技术标签:

【中文标题】SpriteKit SKScene 添加 AVCaptureVideoPreviewLayer CALayer 作为背景不起作用【英文标题】:SpriteKit SKScene add AVCaptureVideoPreviewLayer CALayer as background not working 【发布时间】:2013-10-28 21:21:11 【问题描述】:

我正在尝试将 AVCaptureVideoPreviewLayer CALayer 作为背景添加到我的 SKScene。我可以将 CALayer 添加到场景中,但无论尝试如何订购 CALayer 始终是最顶层的对象。

在 didMoveToView 我有这个功能:

- (void) didMoveToView:(SKView *)view

    [self addVideo];

 

调用addVideo函数:

-(void) addVideo 

AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
captureSession.sessionPreset = AVCaptureSessionPresetHigh;

AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];

[captureSession addInput:videoIn];

AVCaptureVideoPreviewLayer *avLayer =
[AVCaptureVideoPreviewLayer layerWithSession:captureSession];
avLayer.frame = self.view.bounds;

CGSize landscapeSize;
landscapeSize.width = self.view.bounds.size.height;
landscapeSize.height = self.view.bounds.size.width;


CGRect landscapeRect;
landscapeRect.size = landscapeSize;
landscapeRect.origin = self.view.bounds.origin;

avLayer.frame = landscapeRect;

if(avLayer.connection.supportsVideoOrientation)

    avLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;


[self.scene.view.layer insertSublayer:avLayer atIndex:0];
[self.scene.view.layer setNeedsLayout];


[captureSession startRunning];

我尝试了多种方法将 AVCaptureVideoPreviewLayer CALayer 作为背景。每次将一个节点添加到场景中时,它都在这个 CALayer 之上,有什么建议吗?

尝试了以下功能:

- (void) sendSublayerToBack:(CALayer *)layer

   [layer removeFromSuperlayer];
    [self.view.layer insertSublayer:layer atIndex:0];

但还是不行……

【问题讨论】:

这个哈尔福德你解决了吗? @vburojevic 很抱歉回复晚了,如果您有,则无法解决此问题 @Halford 你是怎么解决这个问题的?谢谢。 【参考方案1】:

不要在 SKView 层中显示该层 - 创建另一个 UIView 并将其放置在视图层次结构中,使其位于 SKView 后面。然后将视频层添加到该 UIView。

您必须使 SKView 透明,尽管在这里我不确定这是否有效 - 如果它完全像 cocos2d 那样有效:将 opaque 属性设置为 NO 并将 backgroundColor 属性更改为 nil(如果不是已经为零)。这应该使 SKView 透明。

如果这些都不起作用,也许您可​​以使用 SKVideoNode 找到解决方法。

【讨论】:

看来我将不得不使用 SKVideoNode,但是我如何获得像 AVCaptureVideoPreviewLayer 一样的实时摄像机视频源。 SKVideoNode 需要一个 AVPlayer 或视频文件 NSURL,例如,您将如何将其连接到我的 Documents 目录中的视频文件。我尝试了 AVPlayer 但您需要停止 AVCaptureSession 才能获取视频,这不符合要求。需要表现得像 AVCaptureVideoPreviewLayer,有什么建议吗? 可能会为视频预览提供一个常规的 UIKit 故事板,当该部分完成后返回精灵套件视图控制器 抱歉,如果我的初始代码不够清晰,该视频旨在作为 SKScene 的背景,因此 SKNodes 和游戏玩法将位于相机视频源之上。无论如何将 AVPlayer 连接到 AVCaptureVideoPreviewLayer?或者将 AVPlayer 设置为一些实时摄像机源? 不知道,但如果这是一个“增强现实”应用程序,您将需要使用 UIImagePickerController。这是 cocos2d 应用程序的设置:raywenderlich.com/3997/… 不幸的是 SKView 不能透明,这是当前的限制。

以上是关于SpriteKit SKScene 添加 AVCaptureVideoPreviewLayer CALayer 作为背景不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit:检测当新场景显示以后

SpriteKit:以编程方式修改 SKScene 框架

如何在 SpriteKit 中的 SKScene 上显示 AdMob 横幅广告?

如何使用 Swift 正确切换 SpriteKit 中的 SKScene?

SpriteKit - SKScene 边界不等于 SKView 边界

如何从 Swift SpriteKit 中的另一个 SKScene 访问变量