5

我需要在 AVCaptureVideoPreviewLayer 上显示图像(帧)覆盖。我怎样才能做到这一点?

-(void) viewDidAppear:(BOOL)animated
{
    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetPhoto;
    [session commitConfiguration];

    CALayer *viewLayer = self.vImagePreview.layer;
    NSLog(@"viewLayer = %@", viewLayer);

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    captureVideoPreviewLayer.frame = self.vImagePreview.bounds;
    [self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (!input) {
        // Handle the error appropriately.
        NSLog(@"ERROR: trying to open camera: %@", error);
    }
    [session addInput:input];

    _stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
    [_stillImageOutput setOutputSettings:outputSettings];

    [session addOutput:_stillImageOutput];

    [session startRunning];

}

在视频输出层上添加新视图不起作用。预览层出现在所有视图的顶部。

我的视图层次结构:

  • 主视图
    • 叠加视图
    • 视频输出视图

我的帧出现在视频输出视图下

4

4 回答 4

6

尽管这个问题是 N 年前提出的,但我想分享我的确切答案。几分钟后,我能够理解古杰明所说的话。实际上,解决方案可以以编程方式完成。但如果您在 XIB 或 Storyboard 中进行操作,请检查这种层次结构。不要将任何子视图放入您的 CameraPreviewView (其图层将是相机的 uiview)。

在此处输入图像描述

于 2016-03-16T06:05:37.550 回答
3

我想到了。诀窍是将视频扫描视图作为它自己的视图,其中没有任何内容(没有子视图),然后将叠加层添加为同级视图(而不是子视图)。

这个解决方案可以在 Interface Builder 中工作,而无需求助于以编程方式创建视图。

于 2015-02-16T11:29:06.780 回答
0

目前使用 iOS 8.4 和 Xcode 6.4

它为我添加了两个子层self.view,这两个子层都添加到了情节提要中。在我现在拥有的文档大纲中:(顺序很重要 - 不幸的是,较低的视图被绘制在它们上面的视图的顶部 - 一点也不令人困惑。确保overlayView不是不透明的)

View
    previewView
    overlayView

我在我的代码中保留了两个子视图的出口,因此我可以AVCaptureVideoPreviewLayer直接将其添加为子层previewView并设置datasource我的overlayView

因为overlayView我做了一个自定义子类,UIView所以我可以实现drawRect:

在它仍在运行并显示预览时,drawRect:我能够在我识别的捕获的条形码周围绘制矩形。AVCaptureSession

于 2015-07-26T05:06:07.963 回答
-6

通过以编程方式创建所有视图来解决(没有情节提要)

于 2013-08-26T09:33:16.713 回答