GPUImage2 Camera在使用非YUV输出(BGRA)

2024-10-10  本文已影响0人  刘乔泓

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

上一篇下一篇

猜你喜欢

热点阅读