原理:利用
CIFilter
对视频进行逐帧处理
预览
AVPlayerItemVideoOutput
能够处理视频播放过程中像素级别的buffer
,其方法hasNewPixelBufferForItemTime:(CMTime)itemTime
可以判断在itemTime
这个时刻是否有可用的像素信息,copyPixelBufferForItemTime: itemTimeForDisplay:
可以取到这个时刻的像素CVPixelBufferRef
。buffer可以用来生成CIImage
,之后可以用CIFilter
进行处理。CADisplayLink
是一个可以保证与屏幕刷新同步的定时器,利用它可以使视频每显示一帧就处理一帧,这样可以播放经过滤镜处理后的视频。
关键代码
为视频添加输出
_player = [[AVPlayer alloc]initWithURL:url];
_videoOutput = [[AVPlayerItemVideoOutput alloc]initWithPixelBufferAttributes:nil];
[player.currentItem addOutput:videoOutput];
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget: