在AVCaptureVideoPreviewLayer顶部绘制一个矩形,可能吗?
问题描述:
我已经在这个问题上敲了几天头了。在AVCaptureVideoPreviewLayer顶部绘制一个矩形,可能吗?
我想在CALayer(AVCaptureVideoPreviewLayer)上绘制一个矩形,它恰好是iPhone4上摄像头的视频馈送。
这是我设置的一部分;
//(in function for initialization)
-(void)initDevices {
AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo] error:nil];
AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];
captureOutput.alwaysDiscardsLateVideoFrames = YES;
captureOutput.minFrameDuration = CMTimeMake(1, 30);
dispatch_queue_t queue;
queue = dispatch_queue_create("cameraQueue", NULL);
[captureOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
[captureOutput setVideoSettings:videoSettings];
self.captureSession = [[AVCaptureSession alloc] init];
[self.captureSession addInput:captureInput];
[self.captureSession addOutput:captureOutput];
[self.captureSession setSessionPreset:AVCaptureSessionPresetHigh];
self.prevLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.captureSession];
self.prevLayer.frame = CGRectMake(0, 0, 400, 400);
self.prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.prevLayer.delegate = self;
[self.view.layer addSublayer: self.prevLayer];
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {
[self performSelectorOnMainThread:@selector(drawme) withObject:nil waitUntilDone:YES];
}
- (void)drawme {
[self.prevLayer setNeedsDisplay];
}
//delegate function that draws to a CALayer
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx {
NSLog(@"hello layer!");
CGContextSetRGBFillColor (ctx, 1, 0, 0, 1);
CGContextFillRect (ctx, CGRectMake (0, 0, 200, 100));
}
这可能吗?从我当前的代码中,我得到“hello层”打印,但相机馈送没有填充的矩形。
任何帮助都会很棒。 :)
答
我想你应该添加另一个图层到AVCaptureVideoPreviewLayer,我修改你的示例代码。你可以尝试一下。
//(in function for initialization)
-(void)initDevices {
AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo] error:nil];
AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];
captureOutput.alwaysDiscardsLateVideoFrames = YES;
captureOutput.minFrameDuration = CMTimeMake(1, 30);
dispatch_queue_t queue;
queue = dispatch_queue_create("cameraQueue", NULL);
[captureOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
[captureOutput setVideoSettings:videoSettings];
self.captureSession = [[AVCaptureSession alloc] init];
[self.captureSession addInput:captureInput];
[self.captureSession addOutput:captureOutput];
[self.captureSession setSessionPreset:AVCaptureSessionPresetHigh];
self.prevLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.captureSession];
self.prevLayer.frame = CGRectMake(0, 0, 400, 400);
self.prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:self.prevLayer];
self.drawLayer = [CAShapeLayer layer];
CGRect parentBox = [self.captureVideoPreviewLayer frame];
[self.drawLayer setFrame:parentBox];
[self.drawLayer setDelegate:self];
[self.drawLayer setNeedsDisplay];
[self.captureVideoPreviewLayer addSublayer:self.drawLayer];
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {
[self performSelectorOnMainThread:@selector(drawme) withObject:nil waitUntilDone:YES];
}
- (void)drawme {
[self.drawLayer setNeedsDisplay];
}
//delegate function that draws to a CALayer
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx {
NSLog(@"hello layer!");
CGContextSetRGBFillColor (ctx, 1, 0, 0, 1);
CGContextFillRect (ctx, CGRectMake (0, 0, 200, 100));
}
答
或者你也可以只插入一个图片 - 您可以使用AVCaptureVideoPreviewLayer视频捕捉明显,并创建另一个CALayer的(),并使用layer.insertSublayer(...,上面:...)来插入你的“定制”层视频层之上,并通过自定义我的意思是刚才还具有让另外的CALayer说
layer.contents = spinner.cgImage
这里有点更详细的instructions for Swift