欢迎来到天天文库
浏览记录
ID:47105267
大小:26.60 KB
页数:6页
时间:2019-08-04
《ios 实时滤镜》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、iOS编程高性能之路-GPU着色器实现实时滤镜作为智能机照相和摄像功能无疑是其重要的功能,从比较早期使用实时滤镜的path到后期迎头赶上的instagram,他们出彩了滤镜效果和流畅的性能无疑给软件增色不少,而其中最大的功臣就要归功于opengles2.x之后引入的着色器了。Ka&lYY2、{X3A[)Ot[y!ce如何取得视频数据?>PI~zX3nP取得照相时的图片数据加入FrameworkAVFoundation8nsZw,;k_GuVp:p_session=[[AVCaptureSessionalloc]init];nZ=F_]tvk;_videoOutput=[[[AVCaptureVideoDataOutputalloc]init]autorelease];rK>[Ly8[J1/b15Guif([_sessioncanAddOutput:_videoOutput]){wzTEg=i5[_sess3、ionaddOutput:_videoOutput];Miy4、50aa}Vyn4T1Iv/CnMTM~[_videoOutputsetSampleBufferDelegate:selfqueue:videoCaptureQueue];Dc6M"z+Y!bEfWII`S[_sessions5、tartRunning];X&uT!qFd)$az6、F:p`didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer-OF_eEMfromConnection:(AVCaptureConnection*)connection{+-7、eu)sO...O8、'uVy$OSStatuserr=CMBufferQueueEnqueue(previewBufferQueue,sampleBuffer);Z~G!V-Rif(!err){=l9、63dispatch_async(dispatch_get_main_queue(),^{1^:ZGC1jCMSampleBufferRefsbuf=(CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue);Y_>(f)2]U/HbDT[});)z!#A}Y=@10、PoXj(d...PZ~}c0^i<}k:]WK]F[kYflz)nI,9^iK7拿到sbuf之后我们就可以通过以下的方法来获取图片的首地址^2P(l>f/~iFAICVPixelBufferRefpixelBuffer=CMSampleBufferGetImageBuffer(sampleBuffer);EUOw^&V`~qJW$CVPixelBufferLockBaseAddress(pixelBuffer,0);:E`vx[J&3bsRAHtintlen=CVPixelBufferGetDataSize(pixe11、lBuffer);m='0PX#EmsiIWVt!$UInt8*pixel=(UInt8*)CVPixelBufferGetBaseAddress(pixelBuffer);R.0vn12、yhxNBFO_render(pixel,len)//滤镜函数ZV8mcxki<^2&80这样其实就可以简单的实现照相时候的实时滤镜,当然作为高性能的标题,肯定实现不会这么简单,大家可以尝试一下这个方法的效果,我之前尝试的时候原本60帧左右的摄像,对rgb某个单通道操作影响不大,但是一旦操作到三个通道,降帧就很明显,更不用说在摄像时同时还13、要录音了。这时我们要解决这个问题就需要我们下一节来认识着色器。认识着色器用过opengl的同学对着色器应该不会陌生,但对与iOS终端设备的开发者,对于图形图像有着深入了解的人不多,本人也只是个初学者,对于opengles2.x才引入的着色器也是初步认识,WWDC的专题讲座有一节就是讲ope
2、{X3A[)Ot[y!ce如何取得视频数据?>PI~zX3nP取得照相时的图片数据加入FrameworkAVFoundation8nsZw,;k_GuVp:p_session=[[AVCaptureSessionalloc]init];nZ=F_]tvk;_videoOutput=[[[AVCaptureVideoDataOutputalloc]init]autorelease];rK>[Ly8[J1/b15Guif([_sessioncanAddOutput:_videoOutput]){wzTEg=i5[_sess
3、ionaddOutput:_videoOutput];Miy
4、50aa}Vyn4T1Iv/CnMTM~[_videoOutputsetSampleBufferDelegate:selfqueue:videoCaptureQueue];Dc6M"z+Y!bEfWII`S[_sessions
5、tartRunning];X&uT!qFd)$az6、F:p`didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer-OF_eEMfromConnection:(AVCaptureConnection*)connection{+-7、eu)sO...O8、'uVy$OSStatuserr=CMBufferQueueEnqueue(previewBufferQueue,sampleBuffer);Z~G!V-Rif(!err){=l9、63dispatch_async(dispatch_get_main_queue(),^{1^:ZGC1jCMSampleBufferRefsbuf=(CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue);Y_>(f)2]U/HbDT[});)z!#A}Y=@10、PoXj(d...PZ~}c0^i<}k:]WK]F[kYflz)nI,9^iK7拿到sbuf之后我们就可以通过以下的方法来获取图片的首地址^2P(l>f/~iFAICVPixelBufferRefpixelBuffer=CMSampleBufferGetImageBuffer(sampleBuffer);EUOw^&V`~qJW$CVPixelBufferLockBaseAddress(pixelBuffer,0);:E`vx[J&3bsRAHtintlen=CVPixelBufferGetDataSize(pixe11、lBuffer);m='0PX#EmsiIWVt!$UInt8*pixel=(UInt8*)CVPixelBufferGetBaseAddress(pixelBuffer);R.0vn12、yhxNBFO_render(pixel,len)//滤镜函数ZV8mcxki<^2&80这样其实就可以简单的实现照相时候的实时滤镜,当然作为高性能的标题,肯定实现不会这么简单,大家可以尝试一下这个方法的效果,我之前尝试的时候原本60帧左右的摄像,对rgb某个单通道操作影响不大,但是一旦操作到三个通道,降帧就很明显,更不用说在摄像时同时还13、要录音了。这时我们要解决这个问题就需要我们下一节来认识着色器。认识着色器用过opengl的同学对着色器应该不会陌生,但对与iOS终端设备的开发者,对于图形图像有着深入了解的人不多,本人也只是个初学者,对于opengles2.x才引入的着色器也是初步认识,WWDC的专题讲座有一节就是讲ope
6、F:p`didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer-OF_eEMfromConnection:(AVCaptureConnection*)connection{+-
7、eu)sO...O
8、'uVy$OSStatuserr=CMBufferQueueEnqueue(previewBufferQueue,sampleBuffer);Z~G!V-Rif(!err){=l
9、63dispatch_async(dispatch_get_main_queue(),^{1^:ZGC1jCMSampleBufferRefsbuf=(CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue);Y_>(f)2]U/HbDT[});)z!#A}Y=@
10、PoXj(d...PZ~}c0^i<}k:]WK]F[kYflz)nI,9^iK7拿到sbuf之后我们就可以通过以下的方法来获取图片的首地址^2P(l>f/~iFAICVPixelBufferRefpixelBuffer=CMSampleBufferGetImageBuffer(sampleBuffer);EUOw^&V`~qJW$CVPixelBufferLockBaseAddress(pixelBuffer,0);:E`vx[J&3bsRAHtintlen=CVPixelBufferGetDataSize(pixe
11、lBuffer);m='0PX#EmsiIWVt!$UInt8*pixel=(UInt8*)CVPixelBufferGetBaseAddress(pixelBuffer);R.0vn
12、yhxNBFO_render(pixel,len)//滤镜函数ZV8mcxki<^2&80这样其实就可以简单的实现照相时候的实时滤镜,当然作为高性能的标题,肯定实现不会这么简单,大家可以尝试一下这个方法的效果,我之前尝试的时候原本60帧左右的摄像,对rgb某个单通道操作影响不大,但是一旦操作到三个通道,降帧就很明显,更不用说在摄像时同时还
13、要录音了。这时我们要解决这个问题就需要我们下一节来认识着色器。认识着色器用过opengl的同学对着色器应该不会陌生,但对与iOS终端设备的开发者,对于图形图像有着深入了解的人不多,本人也只是个初学者,对于opengles2.x才引入的着色器也是初步认识,WWDC的专题讲座有一节就是讲ope
此文档下载收益归作者所有