圖片發自簡書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了。