如何在AVCaptureVideoPreviewLayer上显示叠加层

6
我需要在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];

}

在视频输出层添加新视图无效。

我的视图层次结构:

  • MainView
    • OverlayView
    • VideoOutputView

我的框架显示在视频输出视图下方

4个回答

7
尽管这个问题已经被问了N年,我仍然想分享我的确切答案。几分钟后,我就能理解Gujamin所说的话了。实际上,解决方案可以通过编程来实现。但是,如果您正在使用XIB或Storyboard,请检查此类层次结构。不要将任何子视图放到您的CameraPreviewView中(其图层将成为相机)。 enter image description here

4
我想到了解决方法。关键是将视频扫描视图作为自己的视图显示,里面没有任何内容(无子视图),然后将覆盖图层作为同级视图添加(而不是作为子视图添加)。
这个解决方案可以在界面构建器中使用,而不必通过编程方式创建视图。

0

目前使用iOS 8.4和Xcode 6.4

我的做法是将两个子层添加到self.view中,两者都在故事板中添加。 在文档大纲中,我现在有:(顺序很重要-不幸的是,较低的视图会绘制在上面的视图之上-一点也不令人困惑。确保overlayView不是不透明的)

View
    previewView
    overlayView

我在代码中为两个子视图都保留了 Outlet,这样我就可以直接将 AVCaptureVideoPreviewLayer 添加为 previewView 的子层,并设置 overlayViewdatasource

对于 overlayView,我创建了一个自定义的 UIView 子类,以便我可以实现 drawRect:

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


-6
通过以编程方式创建所有视图(而不是使用故事板),问题已得到解决。

如果您打算自己解决问题,请在答案中演示解决方案。 - James Palfrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接