再上代码前先简单的了解下视频录制中的几个重要的类和其作用是什么。
讲一个笑话:
今天早上上班,发现自行车不见了,于是问我老婆,我老婆大怒“你TM还有脸说,你昨天喝多了骑个树杈子回来还TM让我给你锁好,别问我,你自己去找去” |
1、捕捉会话
AVCaptureSession是AVFoundation捕捉栈的核心类。一个会话在整个捕捉过程中相当于一个调度器,起到连接输入设备(摄像头)和输出资源的作用。其从物理设备上得到数据流输出到目的地。它还给我们提供了一个控制视频质量的接口(session preset)可以对视频进行一些设置。
2、捕捉连接
捕捉的连接由AVCaptrueConnection提供。它的作用为给捕捉设备输入渲染的媒体类型(通俗讲就是输入数据流的类型)自动建立能够接受此格式媒体类型的捕捉输出端连接,设备的媒体流是什么格式它就找到对应能够接受此格式的输出端。如AVCapureMovieFileOutput可以接受音频和视频数据,它提供桥梁将捕捉设备的媒体流导向此处。就像一根电线一样。
3、捕捉设备
AVCapureDeice控制着设备。为摄像头、麦克风或外接设备提供了一个接口。它提供了许多对设备控制的方法,比如闪光灯、对焦等等。
4、捕捉设备的输入
捕捉设备不能直接与捕捉会话进行联系。但是要完成摄像过程,两者缺一不可。所以,AVCaptureDeviceInput就应运而生。实例化的后建立联系的过程中,最好一个NSError的指针,当出现问题的时候可以迅速的定位到。
5、捕捉输出
捕捉输出使用到的是AVCaptureOutput,它是一个抽象类。所以使用过程中我们使用的都是它的扩展类。此类致力于为捕捉到的会话寻找输出目的地。和捕捉连接区分一下,捕捉会话、捕捉连接、捕捉输出他们三个之间的关系就像男女和媒婆。捕捉设备是男(输入数据),捕捉输出是女(能对应接受数据,输出数据),那捕捉连接就是媒婆,给他们配对。一般在保存捕捉到的数据的时候使用到捕捉输出。
6、捕捉预览
它作用单纯,就是能让我们看到我们在录制什么,要不然屏幕黑的,录到不该录得我们都不知道。它叫做AVCaptureVideoPreviewLayer,它还可以进行缩放和拉伸。
框架搭建
AVCaptureSession *session = [[AVCaptureSession alloc]init]; //创建会话 session.sessionPreset = AVCaptureSessionPresetHigh; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //设备 NSError *error; //捕捉设备输入 AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if ([session canAddInput:input]) {//canAddInput是一个用于判断能否添加的方法,能返回yes不能返回No [session addInput:input]; //添加给会话 } AVCaptureStillImageOutput *imageOutput = [[AVCaptureStillImageOutput alloc] init]; //捕捉输出 imageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG}; //配置格式 AVCaptureMovieFileOutput *videoOutpur = [[AVCaptureMovieFileOutput alloc]init]; //配置一个视频的输出 if ([session canAddOutput:imageOutput]) { [session addOutput:imageOutput]; //添加给会话 [session addOutput: videoOutpur]; } //设置捕捉预览并添加到view的layer上 AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session]; [layer setSession:session]; layer.frame = self.view.frame; [self.view.layer addSublayer:layer]; [session startRunning];
将以上代码加到相关方法中调用就可以实现视频录制,注意得真机调试才可以。第一次运行会出现个弹框,一定要选择允许。