iOS编程高性能之路-GPU着色器实现实时滤镜(1)
(2012-09-06 18:46:52)
if ([_session canAddOutput:_videoOutput]) {
}
dispatch_queue_t videoCaptureQueue = dispatch_queue_create("video_capture_queue_",DISPATCH_QUEUE_SERIAL);
[_videoOutput setSampleBufferDelegate:self queue:videoCaptureQueue];
[_session startRunning];
在session start之后我们就可以通过回调 来得到
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
}
拿到sbuf之后 我们就可以通过以下的方法来获取图片的首地址
CVPixelBufferRef
CVPixelBufferLockBaseAdd
int len = CVPixelBufferGetDataSize
UInt8 *pixel = (UInt8 *)CVPixelBufferGetBaseAddr
_render(pixel,len) //滤镜函数
这样其实就可以简单的实现照相时候的实时滤镜,当然作为高性能的标题,肯定实现不会这么简单,大家可以尝试一下这个方法的效果,我之前尝试的时候原本60帧左右的摄像,对rgb某个单通道操作影响不大,但是一旦操作到三个通道,降帧就很明显,更不用说在摄像时同时还要录音了。这时我们要解决这个问题就需要我们下一节来认识着色器。