我需要在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];
}
在视频输出图层上添加新视图不起作用。 预览图层显示在所有视图的顶部。
我的视图层次结构:
答案 0 :(得分:5)
尽管这个问题是在N年前提出的,但我想分享我的确切答案。几分钟后,我能够理解古吉明说的话。实际上,解决方案可以通过编程方式完成。但是如果您在XIB或Storyboard中进行操作,请检查此类层次结构。不要将任何子视图放到您的CameraPreviewView(其图层将是相机的uiview)。
答案 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)
通过以编程方式创建所有视图(无故事板)来解决