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万像素的图像。现在,大量的实时数据处理。所以,如果你正在做实时图像处理,你需要接受一些低质量的图像。