通过AVFoundation 捕获视频
在 iOS 6 SDK(iOS 5 SDK 以上)中捕捉摄影机的静态拍摄画面,制作类似「录像同时拍照的效果」可以透果很多方式,像是透过
UIImagePickerController 的方式,呼叫 iOS SDK 所提供的 API 来捕捉画面,或是透过
AVFoundation 的方式,建立影像的 AVCaptureSession,并且设定对应的 Input 与 Output。而本篇文章所采用的方法属于后者,我们使用 AVCaptureStillImageOutput 来当做 AVCaptureSession 的 Output 端,输出静态影像。
在开始之前请先替您的项目加上 AVFoundation.framework,并且在对应的类别中引用此头文件。
//----------------------------
//实例化视频捕获对象 [建立 AVCaptureSession]
//----------------------------
AVCaptureSession *session = [[AVCaptureSession alloc]init];
//设置画质
session.sessionPreset = AVCaptureSessionPresetMedium;
//----------------------------
//创建视频图层
//----------------------------
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
captureVideoPreviewLayer.frame = CGRectMake(0, 0, 320, 568);
//设置缩放比例
CGFloat camScaleup = 1.8;
captureVideoPreviewLayer.affineTransform = CGAffineTransformMakeScale(camScaleup, camScaleup);
[self.view.layer addSublayer:captureVideoPreviewLayer];
//----------------------------
//捕捉视频
//----------------------------
//指定媒体类型获得默认捕获设备AVCaptureDevice对象
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
//实例化捕获输入对象
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (!input) {
NSLog(@"%@",error);
}
//加入捕获会话中
[session addInput:input];
//----------------------------
//设置输出的图像
//----------------------------
//实例化静态图像输出对象
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc]init];
//设置输出参数
NSDictionary *dict = [[NSDictionary alloc]initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey ,nil];
stillImageOutput.outputSettings = dict;
[session addOutput:stillImageOutput];
[session startRunning];
//----------------------------
//
//----------------------------
//----------------------------
//
//----------------------------
//----------------------------
//
//----------------------------
//----------------------------
//
//----------------------------
/*!
AVCaptureSession 预设适用于高分辨率照片质量的输出。
Clients may set an AVCaptureSession instance's sessionPreset to AVCaptureSessionPresetPhoto
for full resolution photo quality output.
*/
AVF_EXPORT NSString *const AVCaptureSessionPresetPhoto NS_AVAILABLE(10_7, 4_0);
/*!
AVCaptureSession 预设适用于高质量的视频和音频输出。
AVCaptureSessionPresetHigh 是 sessionPreset 的默认值。
*/
AVF_EXPORT NSString *const AVCaptureSessionPresetHigh NS_AVAILABLE(10_7, 4_0);
/*!
AVCaptureSession 预设适用于中等质量的输出。
实现的输出适合于在无线网络共享的视频和音频比特率。
*/
AVF_EXPORT NSString *const AVCaptureSessionPresetMedium NS_AVAILABLE(10_7, 4_0);
/*!
AVCaptureSession 预设适用于低质量的输出。
为了实现的输出视频和音频比特率适合共享 3G。
*/
AVF_EXPORT NSString *const AVCaptureSessionPresetLow NS_AVAILABLE(10_7, 4_0);
//下面不是针对 ipad iphone 的。针对 MAC_OS
//-----------------------------------------------
/*!
使用此常量设置优化动画 beginTime 属性设置为 0 的时间。
常数是一个小的、 非零的、 积极的值,避免了优化
*/
AVF_EXPORT const CFTimeInterval AVCoreAnimationBeginTimeAtZero NS_AVAILABLE(10_7, 4_0);
/*!
保留长宽比 ;适合层范围内。
*/
AVF_EXPORT NSString *const AVLayerVideoGravityResizeAspect NS_AVAILABLE(10_7, 4_0);
/*!
保留长宽比 ;填充图层边界。
*/
AVF_EXPORT NSString *const AVLayerVideoGravityResizeAspectFill NS_AVAILABLE(10_7, 4_0);
/*!
拉伸以填充图层边界。
*/
AVF_EXPORT NSString *const AVLayerVideoGravityResize NS_AVAILABLE(10_7, 4_0);