AVFoundation框架学习之视频录制基础版
AVFoundation框架简介
在系统中的位置:
框架中主要得类和功能:
1 | AVAnimation //动画类 |
主要应用场景:
1 | * 音频的录制、播放 |
视频流处理
-
AVCaptureDevice //代表了输入设备,例如摄像头与麦克风。
输入设备,包括麦克风、摄像头,通过该对象可以设置物理设备的一些属性(例如相机聚焦、白平衡等)。
-
AVCaptureDeviceInput
设备输入数据管理对象,可以根据AVCaptureDevice创建对应AVCaptureDeviceInput对象,该对象将会被添加到AVCaptureSession中管理。
-
AVCaptureInput //代表了输入数据源
-
AVCaptureOutput //代表了输出数据源
输出数据管理对象,用于接收各类输出数据,通常使用对应的子类
AVCaptureAudioDataOutput
、AVCaptureStillImageOutput
、AVCaptureVideoDataOutput
、AVCaptureFileOutput
,该对象将会被添加到AVCaptureSession中管理。注意:前面几个对象的输出数据都是NSData
类型,而AVCaptureFileOutput代表数据以文件形式输出,类似的,AVCcaptureFileOutput也不会直接创建使用,通常会使用其子类:AVCaptureAudioFileOutput
、AVCaptureMovieFileOutput`。当把一个输入或者输出添加到AVCaptureSession之后AVCaptureSession就会在所有相符的输入、输出设备之间建立连接
-
AVCaptureSession //用于协调输入与输出之间的数据流
媒体(音、视频)捕获会话,负责把捕获的音视频数据输出到输出设备中。一个
AVCaptureSession
可以有多个输入输出。AVCaptureSession
是AVFoundation
捕捉类的中心枢纽,在视频捕获时,客户端可以实例化AVCaptureSession
并添加适当的AVCaptureInputs
、AVCaptureDeviceInput
和输出,比如AVCaptureMovieFileOutput
。通过[AVCaptureSession startRunning]
开始数据流从输入到输出,和[AVCaptureSession stopRunning]
停止输出输入的流动。客户端可以通过设置sessionPreset
属性定制录制质量水平或输出的比特率。
-
AVCaptureVideoPreviewLayer
相机拍摄预览图层,是
CALayer
的子类,使用该对象可以实时查看拍照或视频录制效果,创建该对象需要指定对应的AVCaptureSession对象
实例
-
创建捕捉会话AVCaptureSession
1
2
3
4
5
6
7
8//捕获会话
_captureSession = [[AVCaptureSession alloc] init];
//设置清晰度
if ([self.captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
self.captureSession.sessionPreset = AVCaptureSessionPreset1280x720;
} else {
self.captureSession.sessionPreset = AVCaptureSessionPreset640x480;
} -
获取视频设备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//方法一:选择广角前置摄像头,因为默认的就是广角摄像头
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionFront];
//方法二:从系统的媒体设备组中查找设备,这种方式得到的设备类型即是:
// `deviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera`
- (AVCaptureDevice *)deviceWithMediaType:(AVMediaType)mediaType position:(AVCaptureDevicePosition)position
{
NSArray *devices = [AVCaptureDevice devicesWithMediaType:mediaType];
AVCaptureDevice *captureDevice = devices.firstObject;
for (AVCaptureDevice *dinput in devices) {
if (dinput.position == position) {
captureDevice = dinput;
}
}
return captureDevice;
} -
创建媒体视频输入源
1
2
3
4
5
6NSError *getDeviceInputErr;
AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&getDeviceInputErr];
if (getDeviceInputErr) {
NSLog(@"获取输入设备失败");
return;
} -
创建媒体音频输入源
1
2
3
4
5
6NSError *getaudioInputErr;
AVCaptureDevice *audio = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audio error:&getaudioInputErr];
if (getaudioInputErr) {
NSLog(@"获取音频输入设备失败");
} -
创建视频输出对象
1
2
3
4
5
6
7
8
9
10
11
12AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
////////////////////////以下设置为可选////////////////////////
//设置链接管理对象
AVCaptureConnection *captureConnection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
//设置连接管理对象
//视频稳定设置
if ([captureConnection isVideoStabilizationSupported]) {
captureConnection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto;
}
//视频旋转方向的设置
captureConnection.videoScaleAndCropFactor = captureConnection.videoMaxScaleAndCropFactor; -
将创建的所有输入、输出源添加到视频捕捉会话对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[_captureSession beginConfiguration];
if ([_captureSession canAddInput:deviceInp
[_captureSession addInput:deviceInput]
}
if ([_captureSession canAddInput:audioInpu
[_captureSession addInput:audioInput];
}
if ([_captureSession canAddOutput:movieFileOutput]) {
[_captureSession addOutput:movieFileOutput];
}
[_captureSession commitConfiguration]; -
创建视频预览层
1
2
3
4
5//创建预览层
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
previewLayer.frame = CGRectMake(0, 0, self.playerLayer.bounds.size.width, self.playerLayer.bounds.size.height);
previewLayer.connection.videoOrientation = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo].videoOrientation;
[self.playerLayer.layer addSublayer:previewLayer]; -
开始预览视频
1
[_captureSession startRunning];
-
开始录制
1
2
3
4//设置视频存放路径
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@move.mov",NSTemporaryDirectory()]];
//开始录制视频
[_movieFileOutput startRecordingToOutputFileURL:url recordingDelegate:self]; -
停止录制
1
[_movieFileOutput stopRecording];
请求相机权限
1 | - (void)getCameraAuthorization { |
demo地址:https://github.com/ruqibazao/AVFoundation_note.git