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