使用GPUImage实现视频滤镜

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

关于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的结构图
Snip20160222_3

接入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];

扫我,和云栖在线交流

【云栖快讯】首届阿里巴巴在线技术峰会,将于7月19日-21日20:00-21:30在线举办。峰会邀请到阿里集团9位技术大V,分享电商架构、安全、数据处理、数据库、多应用部署、互动技术、Docker持续交付与微服务等一线实战经验,解读最新技术在阿里集团的应用实践。  详情请点击

本文转自云栖社区:https://yq.aliyun.com
使用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 阅读详情

相关推荐

iOS GPUImage实现视频滤镜录制与聚焦功能实战

GPUImage 不是一个终点,而是一个起点。它教会我们的不仅是“怎么写代码”,更是“怎么设计系统”——如何在多线程环境下保证状态一致?如何在性能与画质之间找到平衡点?如何让用户操作与底层硬件精准同步?如何在长时间运行中防止资源泄漏?这些问题的答案,不会出现在任何官方文档的第一行。它们藏在每一行日志里,每一次崩溃堆栈中,每一个凌晨三点的调试时刻。

weixin_31720909的博客 334

gpuimage给本地视频添加滤镜

gpuimage给本地视频添加滤镜

CPUImage 图片处理

CPUImage 图片处理 ,对image进行处理。 供大家学习

GPUImage之裁剪篇

在录制视频或者拍照的时候,我们经常要对视频或者照片的尺寸进行裁剪.比如微信小视频.在GPUImage中,给我们了一个非常友好的滤镜.GPUImageCropFilter 可以直接剪切视频的尺寸. 首先依旧是先定义设备.滤镜.一级GPUImageView.在拍照篇里面可以找到.这里就不做重复了.唯一不同的是GPUImageCropFilter的定义 代码如下: filter=[[GPUIma...

weixin_33994429的博客 1720

cpuimage 开源之

前年学习opengl做的一个小东西。 原本计划将gpuimage的算法一个一个转写成cpu版本 c,c++版本。 gpuimage项目参考: https://github.com/BradLarson/GPUImage https://github.com/BradLarson/GPUImage2 https://github.com/CyberAgent/android-gpui...

weixin_33971977的博客 289

CPUImage ReSampler 开源项目安装与使用指南

CPUImage ReSampler 开源项目安装与使用指南 一、项目目录结构及介绍 CPUImage ReSampler 是一个高质命令行音频采样率转换工具,基于 GitHub 上的仓库 jniemann66/ReSampler。以下是其典型的项目目录结构概述: src: 包含了项目的主要源代码文件,这里主要分为不同功能模块的实现。 resampler.cpp/hpp: 核心采样率转换逻辑...

gitblog_00313的博客 1076

WebRTC音视频通话-实现GPUImage视频美颜滤镜效果iOS

WebRTC音视频通话-实现GPUImage视频美颜滤镜效果。主要用到GPUImage处理视频画面CVPixelBufferRef,将处理后的CVPixelBufferRef生成RTCVideoFrame,通过调用localVideoSource中实现的didCaptureVideoFrame方法。

一名开发者 1833

使用gpuimage实现的本地视频添加滤镜demo

gpuimage是一个开源的视频滤镜项目。这个demo就是使用这两者实现的本地视频添加滤镜功能。其中包含了一些ffmpeg的工具,可以直接调用。详细信息以后有时间了再补充,先把demo发上来。 gpuimage给本地视频添加滤镜 - 下载频道 - CSDN.NET http://download.csdn.net/detail/baidu_31093133/9845962

秦时明月 3859

Android使用GpuImage给图片、视频、相机添加滤镜.zip

博客地址:https://blog.csdn.net/y280903468/article/details/96477889

android gpu 滤镜

提供各种类型的android滤镜,采用gpu渲染,效果非常好

GPUimageDemo分段录制,及视频合成

自己的代码,还没写完

FFmpeg,opengl,gpuimage,完成音视频同步加GpuImage滤镜功能

FFmpeg,opengl,gpuimage,完成音视频同步加GpuImage滤镜功能 android平台 FFmpeg2.7.2 opengl 2.0

01 GPUImage视频添加滤镜

使用GPUImage视频添加滤镜

白鹤的博客 1861

GPUImage开启相机并且开启滤镜效果

GPUImage提供了GPUImageVideoCamera这么一个类,它的对象能够调用摄像头,并且加上滤镜的效果。     //init VideoCamera     //这里的两个参数可以设定拍摄录像的像素,还有拍摄录像的前后摄像头。不过要注意的是前后摄像头对像素的要求不同,1080P的录像就不可能在钱摄像头完成了哈     videoCamera = [[GPUImageVideoCame

jayzjj000的专栏 1029

iOS:GPUImage 简介及滤镜

GPUImage 是一个开元的基于 GPU 的图片或视频的处理框架,其本身内置了多达 120 多种常见的滤镜效果,并且支持照相机和摄像机的实时滤镜,并且能够自定义图像滤镜。 美颜的基本概念 OpenGL ES: 开源嵌入式系统图形的处理框架,一套图形与硬件接口,创造了软件与图形加速间灵活强大的底层交互接口。用于把处理好的图片显示到屏幕上。 GPU: (图形处理单元)手机或者电脑用于图像处理和渲染的...

GSNICE 2565

iOS GPUImage研究总结

关于GPUImage 这里直接引用官方描述:GPUImage使用GPU处理图像的、他可以对图片、实时画面、视频进行处理。他允许你自定义滤镜、支持iOS4.0。然而,目前缺乏核心形象的一些更高级的功能,比如面部检测。

Quinn's blog ! I'm glad to be here! 1万+
上一篇: 阿里黄轩?应届生是怎样将千万级流量玩弄于股掌之上的~(附视频干货)
下一篇: RDS MySQL空间优化最佳实践
云栖社区
博客等级 码龄11年 121粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值