最近在做一个需要给已有视频加滤镜的app,不是实时滤镜,而是给已经存在的视频加滤镜。
虽然网上有很多关于GPUImage的博客,但大多都是给图片加上滤镜或者是直接在摄像头上加上的实时滤镜,找了很久之后.....
发现在github上本来就有.....
但是在网上找,却没有说很多人给出这样的滤镜教程,这里简单给分享一下下。
1. 首先,什么是GPUImage?详细请度娘之,简单点来说,就是一个用GPU来处理图片和视频的第三方库。
2. 给图像加滤镜,如果是只加滤镜,那么网上有很多的教程,这里就不细说了,这里主要说一下怎么找要用的滤镜和这个滤镜需要设定什么参数。
2.1 寻找要用的滤镜, 其实在无论是很多人推荐的GPUImage还是苹果官方的CoreImage,滤镜的名字本身就已经很能说明这个滤镜的作用了:
另外,在GPUImage里面,每个滤镜类Filter,都会有详细的注释来说明这个Filter的作用
当然,全是英文就是了。。。。。
2.2 配置参数。
在GPUImage中,其实没有CoreImage可以直接用方法来获取当前滤镜需要用的参数那么方便,而是要通过点击进入对应filter的.h文件里面查询。
如图,里面的red、green和blue就是要设定的配置参数。
3. 给已有视频加上滤镜,这个在GPUImage的github上就有官方的实例。。。。大家可以去看看。
<span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-style: italic; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 128, 128);">/* 下面尝试使用GPUImage来给视频加上滤镜。
*/</span>
GPUImageContrastFilter *secondFilter = [[GPUImageContrastFilter alloc] init];
[secondFilter setContrast:<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 160, 112);">1.80</span>];
GPUImageBrightnessFilter *firstFilter = [[GPUImageBrightnessFilter alloc] init];
[firstFilter setBrightness:<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 160, 112);">0.1</span>];
<span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-style: italic; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 128, 128);">//GPUImageColorBurnBlendFilter</span>
GPUImageRGBFilter *filter = [[GPUImageRGBFilter alloc] init];
filter<span class="hljs-variable" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 128, 128);">.red</span> = <span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 160, 112);">0.8</span>;
filter<span class="hljs-variable" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 128, 128);">.green</span> = <span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 160, 112);">1</span>;
filter<span class="hljs-variable" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 128, 128);">.blue</span> = <span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 160, 112);">1.2</span>;
<span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 134, 179);">NSURL</span> *vedioURL = [<span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 134, 179);">NSURL</span> fileURLWithPath:[[<span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 134, 179);">NSBundle</span> mainBundle] pathForResource:<span class="hljs-string" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(33, 145, 97);">@"s2"</span> ofType:<span class="hljs-string" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(33, 145, 97);">@"mp4"</span>]];
GPUImageMovie *movie = [[GPUImageMovie alloc] initWithURL:vedioURL];
movie<span class="hljs-variable" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 128, 128);">.runBenchmark</span> = <span class="hljs-literal" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(149, 65, 33);">YES</span>;
<span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-style: italic; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 128, 128);">//[movie addTarget:filter];</span>
[movie addTarget:secondFilter];
GPUImageMovieWriter *vedioWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:[<span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 134, 179);">NSURL</span> fileURLWithPath:<span class="hljs-string" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(33, 145, 97);">@"/Users/huazai/Desktop/t/t16.mov"</span>] size:CGSizeMake(<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 160, 112);">1280</span>, <span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 160, 112);">800</span>)];
movie<span class="hljs-variable" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 128, 128);">.audioEncodingTarget</span> = <span class="hljs-literal" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(149, 65, 33);">nil</span>;
vedioWriter<span class="hljs-variable" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 128, 128);">.shouldPassthroughAudio</span> = <span class="hljs-literal" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(149, 65, 33);">YES</span>;
movie<span class="hljs-variable" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 128, 128);">.playAtActualSpeed</span> = <span class="hljs-literal" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(149, 65, 33);">NO</span>;
[movie startProcessing];
[filter addTarget:vedioWriter];
<span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-style: italic; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(64, 128, 128);">//[secondFilter addTarget:vedioWriter];</span>
[vedioWriter startRecording];
[vedioWriter setCompletionBlock:^{
<span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(0, 134, 179);">NSLog</span>(<span class="hljs-string" style="border: 0px; margin: 0px; padding: 0px; font-style: inherit; font-family: inherit; vertical-align: baseline; background-color: transparent; color: rgb(33, 145, 97);">@"已完成!!!"</span>);
}];