【问题标题】:SpriteKit SKScene add AVCaptureVideoPreviewLayer CALayer as background not workingSpriteKit SKScene 添加 AVCaptureVideoPreviewLayer CALayer 作为背景不起作用
【发布时间】: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 你是怎么解决这个问题的?谢谢。

标签: ios7 core-animation sprite-kit


【解决方案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 不能透明,这是当前的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2012-07-30
  • 2016-07-27
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多