GPUImage2 摄像头输入使用 hd1920x1080 与 bgra 格式时候,出现花屏
//出现花屏的设置代码
try Camera(sessionPreset: .hd1920x1080, captureAsYUV: false)
经过检查,在GPUImage2 的 Camera 类中,在bgra 输出格式下的1080p分辨率
let bufferWidth = CVPixelBufferGetWidth(cameraFrame)
let bufferHeight = CVPixelBufferGetHeight(cameraFrame)
得到的宽度 bufferWidth != CVPixelBufferGetBytesPerRow(cameraFrame) / 4
实测CVPixelBufferGetBytesPerRow(cameraFrame) / 4 得到的结果为1088,而 bufferWidth 为1080
导致相机数据转OpenGL纹理时候宽度不正确出现花屏
glTexImage2D(GLenum(GL_TEXTURE_2D), 0, GL_RGBA, GLsizei(bufferWidth), GLsizei(bufferHeight), 0, GLenum(GL_BGRA), GLenum(GL_UNSIGNED_BYTE), CVPixelBufferGetBaseAddress(cameraFrame))
查阅苹果开发者论坛,1088为硬件buffer宽度,CVPixelBufferGetWidth为实际宽度,CVPixelBufferGetBytesPerRow 可能与实际宽度不符,可能会比实际宽度大,使用时需要抛弃掉多余数据位。
解决方案:
使用iOS API CVOpenGLESTextureCacheCreateTextureFromImage 替代 glTexImage2D 即可。CVOpenGLESTextureCacheCreateTextureFromImage会自动处理裁切掉多余数据。
参考提交 https://github.com/liuqiaohong0515/GPUImage2/commit/15847786bab7ab7170edbc8616225240e940f6c9