@ios关于GPUImage图片拍摄及视频录制

GPUImage图片拍摄及视频录制、给以后视频添加滤镜

基本属性

  1. GPUImageVideoCamera 视频拍摄;
  2. GPUImageStillCamera 图片拍摄,其实继承于GPUImageVideoCamera,所以GPUImageStillCamera既可以拍照也可以拍视频;
  3. GPUImageFilter 默认滤镜效果
  4. GPUImageMovieWriter录制写入 ;
  5. 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);}];

此文本仅为个人记录,参考其他作者发布内容整合,有些可能解释的不是很透彻,如有任何问题请提出,如有侵权内容,请联系删除

ios关于GPUImage图片拍摄及视频录制相关推荐

  1. iOS开发-UI控件:UIImagePickerController 视频录制操作,视频大小,时间长度

    转自: http://www.cnblogs.com/cocoajin/p/3494290.html 简介: 使用 iOS 系统 UIImagePickerController 获取视频大小 获取视频 ...

  2. 自定义相机及视频录制界面

    最近在公司没什么任务,看项目里面有一个仿照微信朋友圈的秒拍界面,觉得挺有趣的,于是研究了一下AVFoundation,在这里记录这几天学习的心得,大家一起交流. 一般如果UI和UE在设计时只要求功能, ...

  3. DELMIA教程:仿真视频录制功能介绍与使用方法

    目录 功能简介 打开视频录制器 视频生成通用参数设置 视频图像采集参数设置 视频编码与播放参数设置 仿真视频录制操作 仿真视频播放 功能简介 使用DELMIA软件制作好的虚拟仿真项目,往往需要通过视频 ...

  4. iOS开发之GPUImage研究总结,视频、图片等添加滤镜(转载)

    转载自:https://blog.csdn.net/Xoxo_x/article/details/52695032(非常感谢!) Part one: 关于GPUImage 这里直接引用官方描述: Th ...

  5. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  6. 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  7. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  8. iOS 音频播放,录音,视频播放,拍照,视频录制

    iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 2014-12-26 09:15 by KenshinCui, 149110 阅读, 67 评论, 收藏, 编辑 --iOS多媒体 概览 随 ...

  9. iOS开发--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

最新文章

  1. 使用Flow检查React,Redux和React-Redux的全面指南
  2. 说说Keepalived的脑裂
  3. Pokémon Go数据收集是否带来隐私问题
  4. PAT甲级1042 Shuffling Machine:[C++题解]模拟、哈希表、洗牌机
  5. 十大场景带你玩转外国
  6. 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?
  7. 深度学习-超参数调优
  8. matlab 子图title的位置_matlab 画图基本介绍
  9. leetcode 有效的数独
  10. 计算机ip地址无法修改密码,手提电脑怎么修改无线网络的IP地址|无线网络怎么修改密码...
  11. linux 内核部分崩溃,Linux 系统内核崩溃分析处理简介
  12. Git教程——如何创建一个版本库(Repository)
  13. 计算机自带的桌面远程,如何远程控制电脑桌面
  14. 使用开源PhoneGap开发web app
  15. windows解压jar文件
  16. javaWeb 学习笔记14 会话跟踪技术CoolieSession
  17. CF 949D Curfew——贪心(思路!!!)
  18. 【国庆特辑】43份元宇宙报告
  19. 五彩斑斓的颜色可预告心情
  20. 零代码平台-iwx,是想革我们程序员命?

热门文章

  1. 【Web入门项目源码分享】Java+Jsp
  2. shell “==“ vs.“-eq“
  3. 复习 |链表基本操作(逆序)
  4. 周鸿祎火力全开 IoT!
  5. PandoraBox 使用防火墙规则定义非上网时间
  6. matlab 更新数据刷新图
  7. 网库“团计划”帮助企业搭乘团购快车
  8. 三菱PLC分类及型号的基础知识
  9. 背井离乡上海就业三年,是如何坚持走到今天,之后的路又该如何选择??
  10. 进程间通信-无名管道