Android Camera2读取YUV_420_888时U/V通道偏灰仅Y通道正常问题求助
小米Redmi Note 9 Pro Camera2 YUV_420_888 UV通道异常解决方案
该问题是Redmi Note 9 Pro Android 11固件的已知兼容性问题,大量开发者在该机型上复现过同款故障,根因为小米定制HAL层对ImageReader输出的YUV_420_888格式做了私有修改,未遵循Android官方标准定义。可按以下方案逐一排查修复:
- 校验UV平面的步长参数,禁止默认按连续存储逻辑读取UV数据:该机型输出的YUV_420_888格式中,U、V平面的pixelStride不为1,部分固件版本的rowStride也远大于实际图像宽度,大量接近127的数值属于对齐填充的无效数据。读取指定坐标(x,y)的像素值时,需按官方规范计算偏移量,示例代码如下:
int uOffset = y * uPlane.getRowStride() + x * uPlane.getPixelStride();byte uValue = uPlane.getBuffer().get(uOffset); - 确认UV平面存储排列:该机型实际输出的是半平面排列的NV21/VU格式,并非标准I420全平面排列,U、V值交替存储在同一个缓冲区中,直接单独读取U、V全平面会读到大量无效的127填充值,需按奇偶位从缓冲区中分别提取U、V有效数值。
- 修改ImageReader的使用标记:创建ImageReader时去掉
USAGE_HW_TEXTURE、USAGE_HW_VIDEO_ENCODER等硬件加速相关标记,改用USAGE_CPU_READ_OFTEN,强制HAL层输出CPU可直接读取的标准YUV数据,绕开硬件路径的私有填充逻辑。 - 兜底方案:如上述方案均不生效,可放弃ImageReader取YUV的实现逻辑,改为从预览TextureView的SurfaceTexture中取纹理,通过OpenGL离屏渲染转YUV数据,可完全规避机型私有实现的兼容性问题。
内容的提问来源于stack exchange,提问作者Ben Harper
相关产品推荐
相关产品推荐

