相机相关应用一般会用到AVFoundation. 这里简单做个整理。
1、session
AVFoundation是基于session(会话)概念的。 一个session用于控制数据从input设备到output设备的流向。
[Objective-C] 纯文本查看 复制代码 // 创建一个session:
self.session = [[AVCaptureSession alloc] init];
// session允许定义图片的拍摄质量。
self.session.sessionPreset = AVCaptureSessionPresetPhoto;
2、capture device
定义好session后,就该定义session所使用的设备了。(使用AVMediaTypeVideo 来支持视频和图片)[Objective-C] 纯文本查看 复制代码 #pragma mark - 前后摄像头
self.devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDevice *device = [self.devices firstObject];
[self setDevice:device FlashMode:AVCaptureFlashModeAuto];
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
3、capture device input
有了capture device, 然后就获取其input capture device, 并将该input device加到session上。
[Objective-C] 纯文本查看 复制代码
self.deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];
if ([self.session canAddInput:self.deviceInput]) [self.session addInput:self.deviceInput];
4、preview
在定义output device之前,我们可以先使用preview layer来显示一下camera buffer中的内容。这也将是相机的“取景器”。
AVCaptureVideoPreviewLayer可以用来快速呈现相机(摄像头)所收集到的原始数据。我们使用第一步中定义的session来创建preview layer, 并将其添加到main view layer上。
[Objective-C] 纯文本查看 复制代码 self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspect;
[self.preview.layer addSublayer:self.previewLayer];
5、start Run
最后需要start the session.
一般在viewWillAppear:方法中开启,在viewDidDisappear:方法中关闭[Objective-C] 纯文本查看 复制代码 - (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.session startRunning];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.session stopRunning];
} ==============以下内容为“对视频进行实时处理”部分================
6、the output buffer
如果向对视频进行实时处理,则需要直接对camera buffer中的视频流进行处理。
首先我们定义一个图像数据输出(AVCaptureStillImageOutput), 并将其添加到session上。
[Objective-C] 纯文本查看 复制代码 // 媒体输出
self.imageOutput = [[AVCaptureStillImageOutput alloc] init];
self.imageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};
AVCaptureConnection * connection = [self.imageOutput connectionWithMediaType:AVMediaTypeVideo];
connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
if([self.session canAddOutput:self.imageOutput])[self.session addOutput:self.imageOutput];
7、获取图片
[Objective-C] 纯文本查看 复制代码 [self.dataOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
if (imageDataSampleBuffer == NULL) {
return;
}
NSData * imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage * image = [UIImage imageWithData:imageData];
|