Sian 发表于 2015-5-22 13:55:38

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]
查看完整版本: AVFoundation框架基本工作原理