我们接着上一篇废话,这回保证有干货!
打开上次的工程。找到ViewController.h
引用GPUImage头文件
#import "GPUImage.h"
-
添加三个成员
@interface ViewController : UIViewController { GPUImageVideoCamera *_videoCamera; GPUImageOutput<GPUImageInput> *_filter; GPUImageMovieWriter *_movieWriter; }
顾名思义,
GPUImageVideoCamera
用来创建摄像头实例;
GPUImageOutput<GPUImageInput>
用来处理滤镜,这里没有用Filter来命名类名因为GPUImage的接口做的非常通用,滤镜只是图像输出的一种情况;
GPUImageMovieWriter
当然就是写文件的类了,把摄像头捕获的帧数据写入文件。
-
在ViewController.m->viewDidLoad末尾添加以下代码
// 1. Initialize camera _videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetiFrame960x540 cameraPosition:AVCaptureDevicePositionBack]; _videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; _videoCamera.horizontallyMirrorFrontFacingCamera = NO; _videoCamera.horizontallyMirrorRearFacingCamera = NO; // 2. Add camera view to current view GPUImageView *filterView = (GPUImageView *)self.view; [_videoCamera addTarget:filterView]; [_videoCamera startCameraCapture];
960x540和官方demo里的640x480不一样,960的是宽屏,经我多次尝试以后定下的尺寸,兼顾宽屏,性能和画面质量。
- 是不是很简单?运行一下?我猜,app崩溃了。是不是报这个错?
-[UIView nextAvailableTextureIndex]: unrecognized selector sent to instance
-
好了,不开玩笑。那是因为我们还没有设置ViewController的view是什么类,默认为UIView当然找不到GPUImageView类提供的方法。
到storyboard中选中controller里的view
-
好了,再运行,完美!
至此……
诶不行不行,这个效果我用AVFoundation也可以做啊!
那么加个滤镜吧,不然真的浪费了这么强大的库。
-
在之前的第二段代码(看注释)上方加入以下代码
// 3. Set filter _filter = [[GPUImageSepiaFilter alloc] init]; [_videoCamera addTarget:_filter];
第二段代码中有一句要改掉
[_videoCamera addTarget:filterView];
改成
[_filter addTarget:filterView];
没错,相机加到滤镜实例上再加到view上面。-
看看效果
这篇先写到这里,接下来还有很多事情等着我们去一步一步完善,请耐心等待。下一篇中我们要实现按键录像并进行保存。