iOS GPUImage研究三:视频采集并添加实时滤镜


在GPUImage中使用实时滤镜最简单的方法就是使用GPUImageVideoCamera这个类。通过添加滤镜来实时显示音视频。

这里写图片描述


前面http://blog.csdn.net/Xoxo_x/article/details/57079331我们知道:
首先我们要了解,下面的内容:

GPUImageOutput(输出)中含有如下方法

- (void)addTarget:(id<GPUImageInput>)newTarget;

iOS GPUImage研究三:视频采集并添加实时滤镜_第1张图片

滤镜GPUImageFilter继承 GPUImageOutput(输出),并遵守GPUImageInput(输入)协议

@interface GPUImageFilter : GPUImageOutput <GPUImageInput>

这就意味着

– 重点:
所有的滤镜既可以是GPUImageOutput对象,也是id对象。

更深入一点,这说明了滤镜是可以叠加的!也就是传说中的组合滤镜。


GPUImageView有如下定义:

@interface GPUImageView : UIView <GPUImageInput>

GPUImageVideoCamera有如下定义:

@interface GPUImageVideoCamera : GPUImageOutput <AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate>

在滤镜、camera、GPUImageView三者的关系中,可以有以下组合:

滤镜 GPUImageInput\GPUImageOutput
camera GPUImageOutput
GPUImageView GPUImageInput

组合方式 内容
组合一 [滤镜 addTarget GPUImageView];
组合二 [camera addTarget 滤镜];
组合三 [camera addTarget GPUImageView];

我们当我们想要使用滤镜、相机、并显示的时候,
【组合二 + 组合一 】
合并在一起才完美。
将相机的数据输出到滤镜、再将滤镜的数据输出到GPUImageView上。

这使得我们发现,其实滤镜在处理过程中是属于一个通道的地位

于是乎,代码呼之欲出:

//相机
GPUImageVideoCamera*  videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
//滤镜
GPUImageSepiaFilter *filter = [[GPUImageSepiaFilter alloc] init];
//显示view
GPUImageView *filterView = (GPUImageView *)self.view;

//组合
[videoCamera addTarget:filter];
[filter addTarget:filterView];

//相机开始运行
[videoCamera startCameraCapture];

于是我们发现6行代码就搞定了视频采集并添加实时滤镜

效果如下:
iOS GPUImage研究三:视频采集并添加实时滤镜_第2张图片


那么组合滤镜呢?

加代码如下:

GPUImageLuminanceRangeFilter *filter1 = [[GPUImageLuminanceRangeFilter alloc]init];

//组合
    [videoCamera addTarget:filter];
    [filter addTarget:filter1];
    [filter1 addTarget:filterView];

效果如下:
iOS GPUImage研究三:视频采集并添加实时滤镜_第3张图片

关于demo:一共8行代码,需要自己撸一下吧!

//组合
    [videoCamera addTarget:filter];
    [filter addTarget:filter1];
    [filter1 addTarget:filterView];

滤镜组合调换顺序会有惊喜!

最后附上所有代码:

    //相机
    GPUImageVideoCamera*  videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
    //滤镜
    GPUImageSepiaFilter *filter = [[GPUImageSepiaFilter alloc] init];
    GPUImageLuminanceRangeFilter *filter1 = [[GPUImageLuminanceRangeFilter alloc]init];
    //显示view
    GPUImageView *filterView = (GPUImageView *)self.view;

    //组合
    [videoCamera addTarget:filter];
    [filter addTarget:filter1];

    [filter1 addTarget:filterView];

    //相机开始运行
    [videoCamera startCameraCapture];

iOS GPUImage研究序一:内置滤镜:
http://blog.csdn.net/Xoxo_x/article/details/57082804
iOS GPUImage研究二:捕获图像stillCamera写入相册
http://blog.csdn.net/Xoxo_x/article/details/57086446

你可能感兴趣的:(IOS精益编程,GPUImage研究)