在 iOS 中给视频添加滤镜

  • Post author:
  • Post category:其他




「众所周知,视频可以 P」,今天我们来学习怎么给视频添加滤镜。

在 iOS 中,对视频进行图像处理一般有两种方式:

GPUImage



AVFoundation





一、GPUImage

在之前的文章中,我们对 GPUImage 已经有了一定的了解。之前一般使用它对摄像头采集的图像数据进行处理,然而,它对本地视频的处理也一样方便。

直接看代码:

// movie
NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mp4"];
NSURL *url = [NSURL fileURLWithPath:path];
GPUImageMovie *movie = [[GPUImageMovie alloc] initWithURL:url];

// filter
GPUImageSmoothToonFilter *filter = [[GPUImageSmoothToonFilter alloc] init];

// view
GPUImageView *imageView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 80, self.view.frame.size.width, self.view.frame.size.width)];
[self.view addSubview:imageView];

// chain
[movie addTarget:filter];
[filter addTarget:imageView];

// processing
[movie startProcessing];

核心代码一共就几行。

GPUImageMovie

负责视频文件的读取,

GPUImageSmoothToonFilter

负责滤镜效果处理,

GPUImageView

负责最终图像的展示。

通过滤镜链将三者串起来,然后调用

GPUImageMovie



startProcessing

方法开始处理。

虽然

GPUImage

在使用上简单,但是存在着

没有声音



在非主线程调用 UI



导出文件麻烦



无法进行播放控制

等诸多缺点。


小结:

GPUImage

虽然使用很方便,但是存在诸多缺点,不满足生产环境需要





二、AVFoundation





1、 AVPlayer 的使用

首先来复习一下

AVPlayer

最简单的使用方式:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"mp4"];
AVURLAsset *asset = [AVURLAsset assetWithURL:url];
AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
    
AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];

第一步先构建

AVPlayerItem

,然后通过

AVPlayerItem

创建

AVPlayer

,最后通过

AVPlayer

创建

AVPlayerLayer


AVPlayerLayer



CALayer

的子类,可以把它添加到任意的

Layer

上。当

AVPlayer

调用

play

方法时,

AVPlayerLayer

上就能将图像渲染出来。


AVPlayer

的使用方式十分简单。但是,按照上面的方式,最终只能在

AVPlayerLayer

上渲染出最原始的图像。如果我们希望在播放的同时,对原始图像进行处理,则需要修改

AVPlayer

的渲染过程。





版权声明:本文为a1661408343原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。