人生一条路,走自己的路,
人生两个好,身体好,心情好
好好珍惜每一天!
公司的App里面需要添加个发送小视频功能,需要尽快搞出来,直接让模仿微信的小视频。查资料得出:
一.调用UIImagePickerController,这个相对来说比较简单,不过这个控制录制最大时长比较麻烦,代码如下:
1 | - (IBAction)recordBegin:(id)sender { |
1 |
|
二.使用AVFoundation提供的录像,步骤大概分以下几个
1.获取摄像头授权 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28- (void)getAuthorization {
switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]) {
case AVAuthorizationStatusAuthorized: { // 已授权,可使用
[self setupAVCaptureInfo];
break;
}
case AVAuthorizationStatusNotDetermined: { //未进行授权选择再次请求授权
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted) {
[self setupAVCaptureInfo];
} else {
[self showAuthorizationAlert];
}
return;
}];
break;
}
default: { //用户拒绝授权/未授权
[self showAuthorizationAlert];
break;
}
}
}
// 显示没有授权的提示框
- (void)showAuthorizationAlert {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"拒绝授权,返回上一页.请检查下\n设置-->隐私/通用等权限设置" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
[alert show];
}
2.创建AVCaptureSession对象 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16- (void)setupAVCaptureInfo {
_captureSession = [[AVCaptureSession alloc] init];
if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset640x480]) {
[_captureSession setSessionPreset:AVCaptureSessionPreset640x480];
}
[_captureSession beginConfiguration];
[self addVideo]; // 添加视频输入源
[self addAudio]; // 添加音频输入源
[self addOutput];
[self addPreviewLayer]; // 添加预览
[_captureSession commitConfiguration];
[_captureSession startRunning];
}
3.添加输入源 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37- (void)addVideo {
// 获取后置摄像头
_videoDevice = [self deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack];
// 将视频输入添加到captureSession
NSError *videoError;
_videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:_videoDevice error:&videoError];
if (nil == videoError) {
if ([_captureSession canAddInput:_videoInput]) {
[_captureSession addInput:_videoInput];
}
}
}
- (void)addAudio {
NSError *audioError;
_audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
_audioInput = [[AVCaptureDeviceInput alloc] initWithDevice:_audioDevice error:&audioError];
if (nil == audioError) {
// 将音频输入对象添加到会话 (AVCaptureSession) 中
if ([_captureSession canAddInput:_audioInput]) {
[_captureSession addInput:_audioInput];
}
}
}
// 获取前/后摄像头
- (AVCaptureDevice *)deviceWithMediaType:(NSString *)mediaType preferringPosition:(AVCaptureDevicePosition)position {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:mediaType];
AVCaptureDevice *captureDevice = devices.firstObject;
for (AVCaptureDevice *device in devices ) {
if (device.position == position ) {
captureDevice = device;
break;
}
}
return captureDevice;
}
4.添加预览 1
2
3
4
5
6
7- (void)addPreviewLayer {
_captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
_captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_captureVideoPreviewLayer.connection.videoOrientation = [_movieOutput connectionWithMediaType:AVMediaTypeVideo].videoOrientation;
_captureVideoPreviewLayer.frame = self.view.layer.bounds;
[self.view.layer insertSublayer:_captureVideoPreviewLayer atIndex:0];
}
5.添加输出源 (输出源先介绍两种种方式,一种AVCaptureMovieFileOutput直接将视频写入文件,如果不需要对视频做其他处理的话,用AVCaptureMovieFileOutput相对来容易点,代码量也会少很多。另外一种同时添加AVCaptureVideoDataOutput和AVCaptureAudioDataOutput,这个保存的时候需要用AVAssetWriterInput将音视频写入文件)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// AVCaptureMovieFileOutput
- (void)addOutput {
// 将视频输出添加到captureSession
_movieOutput = [[AVCaptureMovieFileOutput alloc] init];
if ([_captureSession canAddOutput:_movieOutput]) {
[_captureSession addOutput:_movieOutput];
AVCaptureConnection *captureConnection = [_movieOutput connectionWithMediaType:AVMediaTypeVideo];
if ([captureConnection isVideoOrientationSupported]) {
[captureConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
}
// 视频稳定设置
// if ([captureConnection isVideoStabilizationSupported]) {
// captureConnection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto;
// }
captureConnection.videoScaleAndCropFactor = captureConnection.videoMaxScaleAndCropFactor;
}
}
---------------------------------------------分割线------------------------------------------------------视频没有特殊处理的用上面那个方法就可以了,AVCaptureVideoDataOutput和AVCaptureAudioDataOutput有时间单独开一篇。
6. 开始录像和停止录像 1
2
3
4
5
6
7
8
9
10
11- (void)startRecord {
[_movieOutput startRecordingToOutputFileURL:[self outPutFileURL] recordingDelegate:self];
}
- (void)stopRecord {
[_movieOutput stopRecording];
}
- (NSURL *)outPutFileURL {
return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), @"tempOutPut.mov"]];
}
简单的录制视频就算完成了,领导后来要求要和钉钉或者qq的小视频一样,视频可以分段删除。花了一天时间找分段删除方法也没找到合适的,后来果断每一段就是一个视频(一个视频有多个小视频组成),android和ios可以连续播放多个视频,也和一个视频差不多,不过后台不愿意这样干(不知道是不是那边没找到联系播放多个的好方法),没办法啊,后来打算用ffmpeg将多个视频拼接成一个视频。
…
- 以上代码都是参考下面连接
Kenshin Cui’s Blog, KevinMkY’s Blog