利用CIFilter给视频流加滤镜

图片发自App
图片发自App

最近公司出新需求,要给视频流加滤镜,考虑到使用GPUImage会影响到我们现有的人脸识别、人脸追踪功能,我们选择在拿到视频流之后利用CIFilter加滤镜这样子的做法。 在获取视频流的回调方法中酱紫处理一下就好了。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CIImage *ciImage = [CIImage imageWithCVImageBuffer:imageBuffer];

self.filter = [CIFilter filterWithName:@"CIToneCurve"];
[self.filter setValue:ciImage forKey:@"inputImage"];

CIImage *outputImage = [self.filter outputImage];
CGImageRef outputImageRef = [self.ciContext createCGImage:outputImage fromRect:outputImage.extent];

dispatch_sync(dispatch_get_main_queue(), ^{
    self.preView.layer.contents = (__bridge id _Nullable)(outputImageRef);
});

CGImageRelease(outputImageRef);}

preView是用来显示加了滤镜之后的视图。
如果你在项目中使用AVCaptureVideoPreviewLayer来显示数据,你就会发现,不管你怎么处理数据流,它都跟死鱼一样不会有任何改变!!!因为AVCaptureVideoPreviewLayer会自动显示相机拍到实时预览图。不要问我为什么特意补充这个事情...不要问不要问不要问!!!
所以,如果你想要在得到的流数据上加一层滤镜,那就自己做一个视图来解决拉。唔,这样子拿到的数据流显示在视图上会有90°的偏差,因为CIImage的坐标别出一格的原因,需要寄己手动transform一下就OK了。

你可能感兴趣的:(利用CIFilter给视频流加滤镜)