/// 創建相機和濾鏡
- (void)createVideoCamera:(AVCaptureDevicePosition)frontOrBack{
[videoCamera removeAllTargets];
videoCamera = nil;
videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:frontOrBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
/// horizontallyMirrorFrontFacingCamera 屬性 YES 代表前置的時候不是鏡像
videoCamera.horizontallyMirrorFrontFacingCamera = YES;
videoCamera.horizontallyMirrorRearFacingCamera = NO;
/// 裁剪濾鏡
cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0, (1280-720)/2/1280.0, 1,720/1280.0)];
/// 自定義的美顏濾鏡
beautyFilter = [[GPUImageBeautyFilter alloc] init];
/// 濾鏡分組
filterGroup = [[GPUImageFilterGroup alloc] init];
/// 沒有開美顏
if (!isBeauty) {
[videoCamera addTarget:cropFilter];
/// 預覽層 /*預覽層可以省略*/
[cropFilter addTarget:preView];
}
else{/// 美顏和裁剪濾鏡都加到濾鏡組里
[cropFilter addTarget:beautyFilter];
[filterGroup addTarget:cropFilter];
[filterGroup addTarget:beautyFilter];
[filterGroup setInitialFilters:[NSArray arrayWithObject:cropFilter]];
[filterGroup setTerminalFilter:beautyFilter];
[filterGroup forceProcessingAtSize:preView.frame.size];
[filterGroup useNextFrameForImageCapture];
[videoCamera addTarget:filterGroup];
[filterGroup addTarget:preView];
}
/// 開始捕捉
[videoCamera startCameraCapture];
}
///開始錄制 分段錄制每次都要實例化一個movieWriter
- (void)startPhoto {
/// 根據時間生成路徑 錄制的視頻會存儲到該路徑下 要唯一
NSString *pathToMovie = [self getVideoMergeFilePathString];
[videoArray addObject:pathToMovie];
NSLog(@"%@",pathToMovie);
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
// movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720, 720) fileType:AVFileTypeQuickTimeMovie outputSettings:videoSettings];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720, 720)];
/// audioSettings 一些音頻配置
/*
AudioChannelLayout channelLayout;
memset(&channelLayout, 0, sizeof(AudioChannelLayout));
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,//制定編碼算法
[ NSNumber numberWithInt: 2 ], AVNumberOfChannelsKey,//聲道
[ NSNumber numberWithFloat: 16000.0 ], AVSampleRateKey,//采樣率
[ NSData dataWithBytes:&channelLayout length: sizeof( AudioChannelLayout ) ], AVChannelLayoutKey,
[ NSNumber numberWithInt: 32000 ], AVEncoderBitRateKey,//編碼率
nil];
*/
[movieWriter setHasAudioTrack:YES audioSettings:audioSettings];
movieWriter.hasAudioTrack = YES;
[videoCamera addAudioInputsAndOutputs];
videoCamera.audioEncodingTarget = movieWriter;
if (!isBeauty) {
[cropFilter addTarget:movieWriter];
}
else {
[filterGroup addTarget:movieWriter];
}
[movieWriter startRecording];
}
///完成錄制
- (void)endRecording {
[movieWriter finishRecording];
[cropFilter removeTarget:movieWriter];
[beautyFilter removeTarget:movieWriter];
[filterGroup removeTarget:movieWriter];
videoCamera.audioEncodingTarget = nil;
// [self savePhotoCmare:videoArray.lastObject];
}
///把錄制好的視頻寫相冊
- (void)savePhotoCmare:(NSString *)pathToMovie {
NSURL *url = [[NSURL alloc] initFileURLWithPath:pathToMovie];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:url]) {
[library writeVideoAtPathToSavedPhotosAlbum:url
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, nil];
[alert show];
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Video Saved" message:@"Saved To Photo Album" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
}
});
}];
}
}