使用GPUImage实现视频滤镜

关于GPUImage

这里直接引用官方描述:
The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated filters and other effects to images, live camera video, and movies. In comparison to Core Image (part of iOS 5.0), GPUImage allows you to write your own custom filters, supports deployment to iOS 4.0, and has a simpler interface. However, it currently lacks some of the more advanced features of Core Image, such as facial detection.
项目地址:https://github.com/BradLarson/GPUImage

滤镜基本原理

滤镜处理的原理就是把静态图片或者视频的每一帧进行图形变换再显示出来。它的本质就是像素点的坐标和颜色变化,这点从GPUImage项目中滤镜的源代码就可以了解到。
例如下面就是一个名为DarkenBlend的滤镜代码:


NSString *const kGPUImageDarkenBlendFragmentShaderString = SHADER_STRING
(
 varying highp vec2 textureCoordinate;
 varying highp vec2 textureCoordinate2;

 uniform sampler2D inputImageTexture;
 uniform sampler2D inputImageTexture2;

 void main()
 {
    lowp vec4 base = texture2D(inputImageTexture, textureCoordinate);
    lowp vec4 overlayer = texture2D(inputImageTexture2, textureCoordinate2);

    gl_FragColor = vec4(min(overlayer.rgb  base.a, base.rgb  overlayer.a) + overlayer.rgb  (1.0 - base.a) + base.rgb  (1.0 - overlayer.a), 1.0);
 }
);

GPUImage的最新版本已经内置了125个滤镜。也支持编写自定义滤镜(custom filter)。

图像处理流程

数据源需要实现GPUImageOutput接口,而后续各个环节(包括最后处理输出结果)的对象都要实现GPUImageInput接口。每个处理环节都是从上一个环节获取图像数据,进行处理后再将结果传递给下一个。下游的处理对象称为上一步的target。使用addTarget:方法为处理链路添加每个环节的对象。一个常见的链条如下:
数据源(例如GPUImageVideoCamera或者GPUImageMovie)->各类filter->GPUImageView
如果需要将结果输出到文件,只要把上述流程中最末的GPUImageView改为一个GPUImageMovieWriter即可。所以滤镜的添加和替换,以及输出结果都十分简单方便。

附一张GPUImage的结构图

接入app

将滤镜接入app非常简单,只要创建一个GPUImageMovie,一个具体的GPUImageFilter和一个用来显示的GPUImageView,然后按处理链条的上下游关系把它们用addTarget串起来。
下面附上我的app里面的调用代码(预览视频):


    _movie = [[GPUImageMovie alloc] initWithURL:url];
    _movie.shouldRepeat = YES;
    _movie.playAtActualSpeed = YES;
    _movie.playSound = YES;
    _movie.delegate = self;

    GPUImageMissEtikateFilter *filter = [[GPUImageMissEtikateFilter alloc] init];//胶片效果
    [_movie addTarget:filter];
    [filter addTarget:self.gpuImageView];

    [_movie startProcessing];

然后就是一些重要的参数设置:
playAtActualSpeed
控制GPUImageView预览视频时的速度是否要保持真实的速度。如果设为NO,则会将视频的所有帧无间隔渲染,导致速度非常快。设为YES,则会根据视频本身时长计算出每帧的时间间隔,然后每渲染一帧,就sleep一个时间间隔,从而达到正常的播放速度。

shouldRepeat
控制视频是否循环播放。

当你不想预览,而是想将处理过的结果输出到文件时,步骤也类似,只是不再需要创建GPUImageView,而是需要一个GPUImageMovieWriter:


    _writer = [[GPUImageMovieWriter alloc] initWithMovieURL:filtedMovieURL size:CGSizeMake(480, 640) fileType:(NSString *)kUTTypeMPEG4 outputSettings:outputSettings];
    _writer.encodingLiveVideo = NO;
    _writer.shouldPassthroughAudio = NO;
    _movie.audioEncodingTarget = _writer;
    _movie.playAtActualSpeed = NO;
    [_movie addTarget:_curFilter];
    [_curFilter addTarget:_writer];
    [_movie enableSynchronizedEncodingUsingMovieWriter:_writer];
    [_writer startRecording];
    [_movie startProcessing];

一些局限和踩过的坑

1.预览时不支持播放声音
视频结果输出到GPUImageView预览时不支持播放声音,所以要自行添加声音播放:
自行创建了一个播放器对象


- (void) setupSound
{
    if (theAudioPlayer != nil)
    {
        [theAudioPlayer pause];
        [theAudioPlayer seekToTime:kCMTimeZero];
        theAudioPlayer = nil;
    }
    theAudioPlayer = [[AVPlayer alloc] initWithURL:self.url];
}

跟GPUImageView的图像同步播放


    if (self.playSound && hasAudioTrack)
    {
        [theAudioPlayer seekToTime:kCMTimeZero];
        [theAudioPlayer play];
    }

由于GPUImageMovie里面没有在这几个重要位置提供回调,所以只能在源代码中直接添加,这也导致了对源码的侵入,不利于以后版本升级。

2.GPUImageView预览视频并循环播放时,当播放重新开始时,有大约50%的概率会有红屏闪一下,目前还未定位到原因

3.GPUImageView预览视频时,app切到后台会crash,所以要特别处理下,在willDisappear和handleApplicationWillEnterBackgroundNotify这两个时机都要暂停滤镜处理:


    if (_movie) {
        [_movie endProcessing];
        [_movie removeAllTargets];
        _movie = nil;
    }

对应的,在willAppear和handleApplicationWillEnterForegroundNotify这两个时机要重启处理:


    if (!_movie) {
        _movie = [[GPUImageMovie alloc] initWithURL:url];
    }

    _movie.shouldRepeat = YES;
    _movie.playAtActualSpeed = YES;
    _movie.playSound = YES;
    _movie.delegate = self;

    [_movie addTarget:_curFilter];
    [_curFilter addTarget:self.gpuImageView];

    [_movie startProcessing];
时间: 2024-11-08 21:21:37

使用GPUImage实现视频滤镜的相关文章

PS内置滤镜使用教程:视频滤镜

     PS内置滤镜使用教程:视频滤镜 Video(视频) 滤镜属于photoshop的外部接口程序,用来从摄像机输入图像或将图像输出到录像带上. 1.NTSC(NTSC颜色滤镜) 作用:将色域限制在电视机重现可接受的范围内,以防止过饱和颜色渗到电视扫描行中.此滤镜对基于视频的因特网系统上的Web图像处理很有帮助.(注:此组滤镜不能应用于灰度,CMYK和Lab模式的图像) 调节参数:无 图解效果:无 2.De-Interlace(逐行滤镜) 作用:通过去掉视频图像中的奇数或偶数交错行,使在视频

图解Photoshop内置滤镜10:视频

滤镜 第十组:Video(视频) Video(视频) 滤镜属于Photoshop的外部接口程序,用来从摄像机输入图像或将图像输出到录像带上. 1.NTSC(NTSC颜色滤镜) 作用:将色域限制在电视机重现可接受的范围内,以防止过饱和颜色渗到电视扫描行中.此滤镜对基于视频的因特网系统上的Web图像处理很有帮助.(注:此组滤镜不能应用于灰度,CMYK和Lab模式的图像) 调节参数:无 图解效果:无 2.De-Interlace(逐行滤镜) 作用:通过去掉视频图像中的奇数或偶数交错行,使在视频上捕捉的

短视频分享服务Instagram可支持13种滤镜

硅谷网讯 短暂的http://www.aliyun.com/zixun/aggregation/3321.html">新品发布会中, Facebook宣布推出支持短 视频功能的全新社交图片和视频分享服务Instagram.相比现有服务,Instagram将允许用户录制时长为15秒的短视频进行分享,同时,这款服务还像图片分享服务一样支持滤镜. 不过,目前视频滤镜只有13种,但Facebook会在日后不断进行更新. 过去数年的迅 速发展,使得Instagram成长为拥有超过160亿张照片.月活

PHOTOSHOP 7滤镜说明(下)

滤镜 六.Pixelate(像素化)滤镜 像素化滤镜主要用于不同程度地将图像进行分块处理,使图像分解成肉眼可见的像素颗粒,如方形.不规则多边形和点状等,视觉上看就是图像被转换成由不同色块组成的图像. (1) Color Halfone(彩色半调) 该滤镜可以将图像中的每种颜色分离,将一幅连续色调的图像转变为半色调的图像,使图像看起来类似彩色报纸印刷效果或铜版化效果. (Max Radius)最大半径:调整彩色半调的大小. (Screen Angles[Degrees])网角(度): 通道1(Ch

photoshop视频功能介绍

Video(视频) 滤镜属于Photoshop的外部接口程序,用来从摄像机输入图像或将图像输出到录像带上. 1.NTSC(NTSC颜色滤镜) 作用:将色域限制在电视机重现可接受的范围内,以防止过饱和颜色渗到电视扫描行中.此滤镜对基于视频的因特网系统上的Web图像处理很有帮助.(注:此组滤镜不能应用于灰度,CMYK和Lab模式的图像) 调节参数:无 图解效果:无 2.De-Interlace(逐行滤镜) 作用:通过去掉视频图像中的奇数或偶数交错行,使在视频上捕捉的运动图像变得平滑.可以选择"复制&

视频转换过程中如何去掉电影画面黑框

网上下载的电影观看时常常会发现其实视频画面并没有占满整个播放窗口,而是视频画面周围有黑框,如果将这样的电影视频文件转换到自己的iPad中观看,想不想在进行iPad视频格式转换的同时去掉视频画面周围的黑框呢?只要你想这样做当然就可以实现,使用专业的iPad视频转换器-私房iPad视频格式转换器软件快速高质量转换iPad视频格式的同时还可以轻松去掉原视频画面周围的黑框. 私房iPad视频格式转换器软件 是一个集iPad视频转换与视频编辑于一体的超强大软件,同时软件设计简单易用,即使是初次接触iPad

苹果社交视频创作应用 Clips 上架 App Store

苹果今天宣布,公司全新社交视频创作应用 Clips 将于今天登陆 App Store.Clips 全新登场.这款 iOS app 可以让你利用文字.特效和图像等多种方式,随手制作.分享趣味视频.Clips 支持 即时字幕功能,可以让你轻松创建动态字幕,你要做的,只是按住录制键说话就行. 你还可以选择各种不同的字幕风格,它们会跟随你说话的节奏同步出现在画面上.Clips 还支持视频滤镜:放个表情符号:加个对话气泡.箭头这样的叠层:或者配段音乐来营造点气氛,它会根据视频自动调整长度.Clips 能够

开展视频直播业务的最佳实践【Tech Insight演讲实录】

现场精彩干货: 直播,原先是广电系统的一个概念,十几年前我们印象中的直播还是电视台开一台直播车奔赴抗洪前线,而现在提到直播,我们想到的便成了网络直播. 刚刚过去的2016年可谓是"直播年".2016年,网络直播用户的规模已经达到了3.25亿,占网民总数的45.8%.直播市场规模(PC+移动)达到150 亿元,直播平台数量目前已经超过200家. 8月10日晚,"行走的表情包"傅园慧在某直播平台进行直播首秀,直播的内容就是和大家聊聊天,共有1054万人在线观看了直播,此

视频应用再一次俘虏用户

时下,自文字.语音.图片社交软件流行之后,视频应用再一次俘虏用户,成为社交达人们必备的分享工具之一.秒拍便是这样一款短视频应用,具备拍摄.美化.分享等多种功能.更重要的是,秒拍还是国内最大社交网站新浪微博的专属视频分享工具.用户可直接在新浪微博入口使用秒拍拍摄和分享视频,10S就能变身视频达人,随时随地分享身边的影像和欢笑. 支持新浪微博.QQ及手机号码登录 秒拍的一大优势在于解决了过去手机用户拍摄视频复杂且清晰度不高的关键问题.秒拍界面设计十分简洁,拍摄视频时只需点击界面下方的相机按钮即可.进