1)转为CIImage,UIImage然后调用performSelectorOnMainThread来呈现:(经验还不足,这个api还是google了很多才找到的)
CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer];
UIImage *image= [UIImage imageWithCIImage:ciImage];//:newImage scale:1.0 orientation:UIImageOrientationRight];
[self.mainContentView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
2)使用苹果官方demo GLCameraRipple(https://developer.apple.com/library/ios/samplecode/GLCameraRipple/GLCameraRipple.zip)来显示(这个Demo是用opengl来显示的,效率应该比上面的方法高,而且本身这个demo还有其它的功能----触屏水波纹)
两个方法都是要得到CVPixelBufferRef类型的数据,无奈,使用CVPixelBufferCreateWithPlanarBytes得到了数据,不过其中iosuface是0,导致opengle和ciimage都没法处理(参看http://blog.csdn.net/dabang_007/article/details/19701301) 相应的http://stackoverflow.com上似乎也没有很好的解决掉(有帖子http://stackoverflow.com/questions/15316534/cvpixelbuffer-to-ciimage-always-returning-nil说搞定,但是我用那种方式还是没有成功).
后来想直接用opengl es来处理(因为查linphone相应代码就是如此),发现这个很复杂,昨天有多半天就是查看相关资料,感觉这样会影响功能开发,继续求助google,终于,在http://stackoverflow.com/questions/12428108/ios-how-to-draw-a-yuv-image-using-opengl 这个尾部,看到github上一个代码/kxmovie ,down下来,只用其中的KxMovieGLView.h/KxMovieGLView.m然后视图控制器也做些适配,YUV 420P的数据终于正常显示了!
记录下这个功能点的开发过程:感觉基本功太差(视频相关的知识太少,opengl也基本不会),解决这个问题全靠东拼西凑,不过还好,为何我们那么难看的代码训练出来对代码有一定的掌控力.
优化代码去了.