如何在AVCaptureVideoPreviewLayer上显示叠加层

时间:2013-07-31 08:46:47

标签: ios objective-c avfoundation avcapturesession uiview-hierarchy

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

My frame appears under the video output view

4 个答案:

答案 0 :(得分:5)

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

enter image description here

答案 1 :(得分:3)

我明白了。诀窍是让视频扫描视图成为它自己的视图,里面没有任何内容(没有子视图),然后将叠加层添加为兄弟视图(而不是子视图)。

此解决方案适用于Interface Builder,无需通过编程方式创建视图。

答案 2 :(得分:0)

目前使用iOS 8.4和Xcode 6.4

我在self.view添加了两个子图层,这两个子图层都添加到了故事板中。 在我现在的文档大纲中:(顺序很关键 - 不幸的是,较低的视图是在它们上面的视图中绘制的 - 根本没有混淆。确保overlayView不是不透明的)

View
    previewView
    overlayView

我在代码中保留了两个子视图的插座,因此我可以直接将AVCaptureVideoPreviewLayer添加为previewView的子图层,并设置datasource的{​​{1}}

对于overlayView我创建了overlayView的自定义子类,因此我可以实现UIView

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

答案 3 :(得分:-5)

通过以编程方式创建所有视图(无故事板)来解决