A very cool custom video camera with AVFoundation(译文)

AVFoundation是一个非常酷的框架,允许您收集多媒体数据所产生的不同的输入源(摄像头、麦克风等)和将他们重定向到任何输出目的地(屏幕、扬声器等)。您可以创建自定义播放和捕获音频解决方案,视频和静态图像。使用这个框架的优势对于商用解决方案如MPMoviePlayerController或UIImagePickerController是你获得相机的原始数据。通过这种方式,您可以应用效果实时输入信号的不同的目的。

我为你准备了一个小应用程序,向您展示如何使用这个框架,并创建一个很酷的摄像机。

Session

AVFoundation基于会话的概念。会话是用于控制流数据从输入到输出的设备。创建一个会话很简单:

AVCaptureSession *session = [[AVCaptureSession alloc] init];

会话允许您定义音频和视频记录的质量,使用sessionPreset AVCaptureSession类的属性。对于这个示例,它很好去低质量数据(所以我们节省一些电池循环):

[session setSessionPreset:AVCaptureSessionPresetLow];

Capture Device

捕获会话创建后,您需要定义获取您想要使用的设备。它可以摄像头或麦克风。在本例中,我将使用AVMediaTypeVideo类型,支持视频和图片:

AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

Capture Device Input

下一步,您需要定义的输入捕捉装置,并将它添加到会话。给你:

AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error];
if ( [session canAddInput:deviceInput] )
    [session addInput:deviceInput];

你检查是否可以添加设备输入会话,如果可以,您添加它

Preview

定义设备的输出之前,我想向您展示如何预览摄像机缓冲区。这将是你的相机的取景器,即输入设备的是看到的预览。
我们可以快速呈现原始数据收集的相机使用AVCaptureVideoPreviewLayer在屏幕上。我们可以使用上面定义的会话我们创建这个预览层,然后将它添加到我们的主要视图层:

AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

CALayer *rootLayer = [[self view] layer];
[rootLayer setMasksToBounds:YES];
[previewLayer setFrame:CGRectMake(-70, 0, rootLayer.bounds.size.height, rootLayer.bounds.size.height)];
[rootLayer insertSublayer:previewLayer atIndex:0];

你不需要做任何额外的工作。你现在可以在你的屏幕上显示摄像机信号。
如果你想做一些更酷的东西,例如,如果你想处理摄像头信号创建好的视频效果与核心形象或加速框架(给看看这篇文章),您需要收集原始数据生成的相机,处理它们,,如果你喜欢它,它们显示在屏幕上。

Go baby, go!!!

我们已经准备好去。您需要做的最后一件事是开始会话:

[session startRunning];

Cool stuffs

由于AVCaptureVideoPreviewLayer是一层,显然可以添加动画。我在这里将一个非常简单的Xcode项目显示前面的概念。它创建一个定制的摄像机预览旋转的三维空间。

Real-time processing

如果你想做一些图像处理的原始数据被相机并将结果显示在屏幕上,您需要收集这些数据,处理他们,使他们在屏幕上不使用AVCaptureVideoPreviewLayer。根据你想实现什么,您有两个主要策略:

1、要么你捕获静止画面就需要一个
2、你捕捉连续视频缓冲区

现在,第一种方法是最简单的一个:每当你需要知道相机正在看,你只拍一张照片。相反,如果你想视频缓冲过程,更棘手的,特别是当你的图像处理算法比相机帧速率慢输出。在这里,你需要评估的解决方案更适合你。考虑,这取决于设备你可以得到不同的图像分辨率。例如,iPhone 4 s可以提供8万像素的图像。现在,大量的实时数据处理。所以,如果你正在做实时图像处理,你需要接受一些低质量的图像。

原文地址