利用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了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容