@ios关于GPUImage图片拍摄及视频录制
GPUImage图片拍摄及视频录制、给以后视频添加滤镜
基本属性
- GPUImageVideoCamera 视频拍摄;
- GPUImageStillCamera 图片拍摄,其实继承于GPUImageVideoCamera,所以GPUImageStillCamera既可以拍照也可以拍视频;
- GPUImageFilter 默认滤镜效果
- GPUImageMovieWriter录制写入 ;
- GPUImageView取景框;
初始化摄像头
videoCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionFront];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
[videoCamera addAudioInputsAndOutputs];
videoCamera.horizontallyMirrorFrontFacingCamera = YES;
AVCaptureSessionPresetPhoto 拍照使用,取景跟自带相机相同
下面为其他参数(不一一列举,根据需要选择)
AVCaptureSessionPresetHigh
AVCaptureSessionPresetMedium
AVCaptureSessionPresetLow
AVCaptureSessionPreset1280x720
摄像头位置:前后
AVCaptureDevicePositionFront
AVCaptureDevicePositionBack
输出方向
outputImageOrientation
UIDeviceOrientationPortraitUpsideDown
UIDeviceOrientationLandscapeRight
UIDeviceOrientationLandscapeLeft
加入原声
addAudioInputsAndOutputs
镜像 如果使用前置摄像头会出现反向效果,通过此值可进行设置,
videoCamera.horizontallyMirrorFrontFacingCamera = YES;
一般默认开始为前置摄像头时用以上方法处理,如果默认后置摄像头,用以下方法处理
if (imageCamera.cameraPosition == AVCaptureDevicePositionFront)
[filteredVideoView setInputRotation:kGPUImageFlipHorizonal atIndex:0];
[filteredVideoView setInputRotation:kGPUImageNoRotation atIndex:0];
取景框显示模式
filteredVideoView.fillMode = kGPUImageFillModePreserveAspectRatio;
kGPUImageFillModeStretch //拉伸以填充,会变形
kGPUImageFillModePreserveAspectRatio //维护源图像的长宽比,添加指定背景颜色的条
kGPUImageFillModePreserveAspectRatioAndFill //保持源图像的长宽比,放大它的中心以填充视图
添加滤镜 简单添加滤镜(滤镜效果120多种,可自行搜索使用)
GPUImageBeautifyFilter *filterGroup = [[GPUImageBeautifyFilter alloc]init];
[videoCamera addTarget:filterGroup];
GPUImageBeautifyFilter 为一个美颜磨皮类非GPUImage自带,可自行搜索下载
如果对此效果不满意可使用以下几种滤镜自行设置参数
// 饱和
GPUImageSaturationFilter *saturationFilter;
// 磨皮
GPUImageBilateralFilter *bilateralFilter;
// 美白
GPUImageBrightnessFilter *brightnessFilter;
// 曝光
GPUImageExposureFilter *exposureFilter;
组合滤镜
- (GPUImageFilterGroup *) getGroupFilters {
//创建滤镜组
GPUImageFilterGroup *filterGroup = [[GPUImageFilterGroup alloc]init];
//创建滤镜(设置滤镜的引来关系)
[bilateralFilter addTarget:brightnessFilter];
[brightnessFilter addTarget:exposureFilter];
[exposureFilter addTarget:saturationFilter];
//设置滤镜起点 终点的filter
filterGroup.initialFilters = @[bilateralFilter];
filterGroup.terminalFilter = saturationFilter;
return filterGroup;
}
拍照、录制视频
开始录制
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(filteredVideoView.sizeInPixels.width, filteredVideoView.sizeInPixels.height)];
[videoFilter addTarget:movieWriter];
videoCamera.audioEncodingTarget = movieWriter;
[movieWriter startRecording];
结束视频录制
[movieWriter finishRecording];
[videoFilter removeTarget:movieWriter];
#结束拍照
[videoFilter useNextFrameForImageCapture];
//获取当前数据流的图像,
UIImage *processedImage = [videoFilter imageFromCurrentFramebuffer];
// processedImage 为获取图片
点击拍照拍照
[imageCamera capturePhotoAsImageProcessedUpToFilter:imagefilter withCompletionHandler:^(UIImage *processedImage, NSError *error) {
if(error){
return;
}
processedImage 为拍摄图片
}];
图片添加滤镜效果
- (UIImage *)imageByFilteringImage:(UIImage *)inImage {
CGImageRef inImageRef = [inImage CGImage];
GLuint w = CGImageGetWidth(inImageRef);
GLuint h = CGImageGetHeight(inImageRef);
// 设置要添加滤镜的图片
if(inImage == nil){
inImage = [UIImage imageNamed:@"1"];
}
// 初始化要添加滤镜的图片
GPUImagePicture *imageSorce = [[GPUImagePicture alloc] initWithImage:inImage]; IFImageFilter *filter = [[IFImageFilter alloc] init];
// 设置输出的图片的尺寸
[imageFilter forceProcessingAtSize:CGSizeMake(w, h)];
// 添加滤镜
[imageSorce addTarget:imageFilter];
[imageFilter useNextFrameForImageCapture];
[imageSorce processImage];
return [imageFilter imageFromCurrentFramebuffer]; }
视频添加滤镜预览效果(预览效果没有声音)可提取声音源进行同步播放
self.movieFile = [[GPUImageMovie alloc] initWithURL:[dict objectForKey:@"url"]];
self.movieFile.playAtActualSpeed = NO;//是否原速播放
self.movieFile.shouldRepeat = NO;//是否循环播放
GPUImageOutput<GPUImageInput> *pixellateFilter = [[AlbumFilterManager shareManager] filterType:[[dict objectForKey:@"index"]intValue]];//滤镜效果,此处作者进行了封装,跟胡index取的路径效果
[self.movieFile addTarget:pixellateFilter];
[pixellateFilter addTarget:self];
//开始播放
[self.movieFile startProcessing];
视频添加滤镜合成
//添加视频存储路径
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@.mp4",[NSString uuid]]];
unlink([pathToMovie UTF8String]);
self.pathToMovie = pathToMovie;
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
//视频url用于获取宽高
NSURL *videoUrl1 = [dict objectForKey:@"url"];
AVURLAsset * asss = [AVURLAsset URLAssetWithURL:videoUrl1 options:nil];
CGSize videoSize2 = asss.naturalSize;
NSLog(@"%f %f",videoSize2.width,videoSize2.height);
_saveMovieFile = [[GPUImageMovie alloc] initWithURL:videoUrl1];
//播放速度
_saveMovieFile.playAtActualSpeed = YES;
GPUImageOutput<GPUImageInput> * Filter = [[AlbumFilterManager shareManager] filterType:self.filterIndx.row];
[_saveMovieFile addTarget:Filter];
_movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:videoSize2];
NSLog(@"------movieURL is ----%@",movieURL);
//滤镜添加
[Filter addTarget:_movieWriter];
//是否使用源音源
_movieWriter.shouldPassthroughAudio = YES;
//加入声音
AVAsset *anAsset = [AVAsset assetWithURL:videoUrl1];
//此处视频如果没有声音源则不加入
if ([[anAsset tracksWithMediaType:AVMediaTypeAudio] count] > 0){
_saveMovieFile.audioEncodingTarget = _movieWriter;
} else {//no audio
_saveMovieFile.audioEncodingTarget = nil;
}
[_saveMovieFile enableSynchronizedEncodingUsingMovieWriter:_movieWriter];
//开始处理
[_movieWriter startRecording];
//视频从头播放
[_saveMovieFile startProcessing];
__weak MPPublicDynamicController * weakSelf = self;
__weak GPUImageMovieWriter * weakmovieWriter = self.movieWriter;
[_movieWriter setCompletionBlock:^{
[Filter removeTarget:weakmovieWriter];
[weakmovieWriter finishRecording];
NSLog(@"视频合成结束-成功");
}];
[_movieWriter setFailureBlock:^(NSError *error) {
NSLog(@"视频合成结束-失败");
[Filter removeTarget:weakmovieWriter];
[weakmovieWriter finishRecording];
NSLog(@"合成失败 173:error = %@",error.description);
}];
此文本仅为个人记录,参考其他作者发布内容整合,有些可能解释的不是很透彻,如有任何问题请提出,如有侵权内容,请联系删除