GPUImage 作為一個優(yōu)秀的視頻處理框架耍属,不可謂不流行晋控,so此改,我也蹭一下。一下通過代碼來告訴大家怎么實(shí)現(xiàn)視頻錄制時(shí)加濾鏡以及保存到本地屎勘。 看了代碼有不懂的歡迎私信~~
#import "BBSRecordController.h"#import "BBSRecordHandler.h"#import#import#import#import "LZBPlayerViewController.h"
@interface BBSRecordController ()
@property (nonatomic, strong) UIButton *changeCameraButton;
@property (nonatomic, strong) BBSRecordHandler *recordHandler;
@property (nonatomic, strong) GPUImageVideoCamera *videoCamera;
@property (nonatomic, strong) GPUImageMovieWriter *movieWriter;
@property (nonatomic, strong) GPUImageView *showView;
@property (nonatomic, strong) GPUImageRGBFilter *invert;
@property (nonatomic, strong) NSString *pathToMovie;
@end
@implementation BBSRecordController
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? self.view.backgroundColor = [UIColor whiteColor];
? ? self.pathToMovie = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"aiMovie.mp4"];
? ? self.videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh? cameraPosition:AVCaptureDevicePositionBack];
? ? self.videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
? ? self.videoCamera.horizontallyMirrorFrontFacingCamera = YES;
? ? [self.videoCamera addAudioInputsAndOutputs];
? ? self.invert = [[GPUImageRGBFilter alloc] init];
? ? self.invert.red = 0.5;
? ? self.invert.green = 0.3;
? ? self.invert.blue = 0.6;
? ? [self.videoCamera addTarget:self.invert];
? ? self.showView = [[GPUImageView alloc] initWithFrame:self.view.frame];
? ? self.showView.center = self.view.center;
? ? [self.view addSubview:self.showView];
? ? [self.invert addTarget:self.showView];
? ? [self.videoCamera startCameraCapture];
? ? UIButton *recordButton = [UIButton buttonWithType:UIButtonTypeCustom];
? ? [recordButton setTitle:@"錄制" forState: UIControlStateNormal];
? ? [recordButton setTitle:@"停止" forState: UIControlStateSelected];
? ? [recordButton addTarget:self action:@selector(didTapRecordButton:) forControlEvents:UIControlEventTouchUpInside];
? ? [self.view addSubview:recordButton];
? ? [recordButton mas_makeConstraints:^(MASConstraintMaker *make) {
? ? ? ? make.centerX.equalTo(self.view);
? ? ? ? make.height.mas_equalTo(100);
? ? ? ? make.width.mas_equalTo(60);
? ? ? ? make.bottom.equalTo(self.view).offset(-50);
? ? }];
? ? [self.view addSubview:self.changeCameraButton];
? ? [self.changeCameraButton mas_makeConstraints:^(MASConstraintMaker *make) {
? ? ? ? make.right.equalTo(self.view).offset(-20);
? ? ? ? make.top.equalTo(self.view).offset(20);
? ? }];
? ? UIButton *saveButton = [UIButton buttonWithType:UIButtonTypeCustom];
? ? [saveButton setTitle:@"保存" forState: UIControlStateNormal];
? ? [saveButton addTarget:self action:@selector(saveVideo) forControlEvents:UIControlEventTouchUpInside];
? ? [self.view addSubview:saveButton];
? ? [saveButton mas_makeConstraints:^(MASConstraintMaker *make) {
? ? ? ? make.left.equalTo(self.view).offset(20);
? ? ? ? make.top.equalTo(self.view).offset(20);
? ? }];
}
#pragma mark - EventResponse
- (void)didTapChangeCameraButton {
? ? [self.videoCamera rotateCamera];
}
- (void)didTapRecordButton:(UIButton *)sender {
? ? if (!sender.selected) {
? ? ? ? sender.selected = YES;
? ? ? ? unlink([self.pathToMovie UTF8String]);
? ? ? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
? ? ? ? ? ? [self.invert addTarget:self.movieWriter];
? ? ? ? ? ? self.videoCamera.audioEncodingTarget = self.movieWriter;
? ? ? ? ? ? [self.movieWriter startRecording];
? ? ? ? });
? ? }
? ? else {
? ? ? ? sender.selected = NO;
? ? ? ? [self.invert removeTarget:self.movieWriter];
? ? ? ? self.videoCamera.audioEncodingTarget = nil;
? ? ? ? [self.movieWriter finishRecordingWithCompletionHandler:^{
? ? ? ? ? ? [self saveVideo];
? ? ? ? ? ? self.movieWriter = nil;
? ? ? ? }];
? ? }
}
- (void)saveVideo {
//? ? NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
? ? BOOL exists =? [[NSFileManager defaultManager] fileExistsAtPath:self.pathToMovie];
? ? if (!exists) {
? ? ? ? NSLog(@"不存在");
? ? ? ? return;
? ? }
? ? if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(self.pathToMovie)) {
? ? ? ? //保存相冊核心代碼
? ? ? ? UISaveVideoAtPathToSavedPhotosAlbum(self.pathToMovie, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
? ? }
}
//保存視頻完成之后的回調(diào)
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
? ? if (error) {
? ? ? ? NSLog(@"保存視頻失敗%@", error.localizedDescription);
? ? }
? ? else {
? ? ? ? NSLog(@"保存視頻成功");
? ? }
}
#pragma mark - Getters & Setters
- (UIButton *)changeCameraButton {
? ? if (_changeCameraButton) {
? ? ? ? return _changeCameraButton;
? ? }
? ? _changeCameraButton = [UIButton buttonWithType:UIButtonTypeCustom];
? ? _changeCameraButton.backgroundColor = [UIColor clearColor];
? ? [_changeCameraButton setTitle:@"切換" forState:UIControlStateNormal];
? ? [_changeCameraButton addTarget:self action:@selector(didTapChangeCameraButton) forControlEvents:UIControlEventTouchUpInside];
? ? return _changeCameraButton;
}
- (GPUImageMovieWriter *)movieWriter {
? ? if (_movieWriter) {
? ? ? ? return _movieWriter;
? ? }
? ? NSURL *movieURL = [NSURL fileURLWithPath:self.pathToMovie];
? ? NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
? ? [settings setObject:AVVideoCodecTypeH264 forKey:AVVideoCodecKey];
? ? [settings setObject:[NSNumber numberWithInteger:720] forKey:AVVideoWidthKey];
? ? [settings setObject:[NSNumber numberWithInteger:1280] forKey:AVVideoHeightKey];
? ? _movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720 , 1280) fileType:AVFileTypeMPEG4 outputSettings:settings];
? ? _movieWriter.encodingLiveVideo = YES;
? ? _movieWriter.assetWriter.movieFragmentInterval = kCMTimeInvalid;
? ? return _movieWriter;
}
@end