上一篇我们从摄像头捕捉到了画面并加上了简单的滤镜并显示出来了,接下来急待解决的就是保存捕获的内容到相册。
翻开ViewController.m
-
首先把捕获的内容保存到沙盒的临时目录。一系列动作同样是两三行,我要封装在一个方法里,为之后的一个功能做好准备。
- (void)initMovieWriter { [_filter removeTarget:_movieWriter]; [[NSFileManager defaultManager] removeItemAtURL:[self currentVideoURL] error:nil]; _movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:[self videoURLByIndex:0] size:CGSizeMake(540.0, 960.0)]; _movieWriter.encodingLiveVideo = YES; [_filter addTarget:_movieWriter]; }
-
初始化movie writer的时候URL不用硬编码,用这个方法。先在.h文件中加入一个成员变量
NSUInteger _currentVideoIndex;
(睿智的你一定猜到了我要做什么,不过现在还早):- (NSURL *)currentVideoURL { NSURL *url = [self videoURLByIndex:_currentVideoIndex]; return url; } - (NSURL *)videoURLByIndex:(NSInteger)index { NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie"]; if (index != -1) { pathToMovie = [pathToMovie stringByAppendingString:[NSString stringWithFormat:@"%ld", index]]; } pathToMovie = [pathToMovie stringByAppendingString:@".mp4"]; NSURL *url = [NSURL fileURLWithPath:pathToMovie]; return url; }
在viewDidLoad中第二段代码上方设置
_currentVideoIndex
初始值。
// 4. Setup movie writer
_currentVideoIndex = 0;-
在viewDidLoad中第二段代码下方设置手势操作
// 5. Setup gesture UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [_captureButton addGestureRecognizer:longPressGesture];
-
实现一下
gestureHandler:
的基本框架- (void)handleGesture:(id)sender { if ([sender isKindOfClass:[UILongPressGestureRecognizer class]]) { UILongPressGestureRecognizer *longPressGesture = (UILongPressGestureRecognizer *)sender; switch ([longPressGesture state]) { case UIGestureRecognizerStateBegan: { } break; case UIGestureRecognizerStateEnded: { } break; default: break; } } }
-
保存到相册好复杂哦。没关系,官方demo自动录像10秒保存,记得吗?把相应代码挖出来。在viewDidLoad中第一层dispatch里面获取主线程进行录像并写入临时文件,第二层dispatch预约了10秒后结束录像并保存到相册。
注意movie writer的初始化在每次录像之前进行。因为一旦writer录像过并停止,这个writer实例就不能再次使用了,要重新初始化一个,详见我的另一篇文章
代码挖出来以后在UIGestureRecognizerStateBegan
中添加如下代码:[[NSFileManager defaultManager] removeItemAtURL:[self currentVideoURL] error:nil]; [self initMovieWriter]; _videoCamera.audioEncodingTarget = _movieWriter; [_movieWriter startRecording]; NSLog(@"Start recording");
在UIGestureRecognizerStateEnded
中添加如下代码(记得添加头文件引用#import <AssetsLibrary/AssetsLibrary.h>
):
_videoCamera.audioEncodingTarget = nil;
[_movieWriter finishRecording];
NSLog(@"Movie completed");
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:[self currentVideoURL]]) {
[library writeVideoAtPathToSavedPhotosAlbum:[self currentVideoURL] completionBlock:^(NSURL *assetURL, NSError *error)
{
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Video Saving Failed"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Video Saved" message:@"Saved To Photo Album"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
});
}];
}
需要注意的是这个官方demo比较早了,现在AssetsLibrary已经被弃用了,虽然我们这个demo现在还能用,但也请及时进行更换,使用`<Photos/Photos.h>`。日后我再找机会把这部分代码更新一下。
至此我们这个demo可以任意录像并保存到相册了。这篇的代码可能有漏贴的,如代码有任何问题请及时留言指出。下一篇中我们将加入更加好玩的功能。