You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:45:04