美文网首页
GPUImage2 Camera在使用非YUV输出(BGRA)

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

作者: 刘乔泓 | 来源:发表于2024-10-10 17:25 被阅读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

    相关文章

      网友评论

          本文标题:GPUImage2 Camera在使用非YUV输出(BGRA)

          本文链接:https://www.haomeiwen.com/subject/lwiwrjtx.html