Nexus 9 Camera2 API - YUV_420_888 与 getOutputSizes()

Nexus 9 Camera2 API - YUV_420_888 vs. getOutputSizes()

我正在 Nexus 9 上使用 YUV_420_888 格式实现 Camera2 API。我检查了输出大小并想使用最大(8MP,3280 x 2460)大小来保存.但是,它只是显示为静态线条,类似于没有信号的旧电视。我想坚持使用 YUV_420_888,因为我的最终目标是保存灰度数据(Y 分量)。

我最初认为这是相机带宽问题,但同样的事情发生在一些小尺寸 (320 x 240) 上。 None 即使我增加帧持续时间并减小预览大小以节省带宽,问题也消失了。其他一些尺寸确实有效(2048 x 1536、1280 x 720),但我没有检查所有尺寸。

我开始认为 getOutputSizes() 可能不一定准确。对于除 RAW_SENSOR(JPEG、YUV_420_888、YV12)之外的所有其他格式,它都给出了相同的结果。有没有人遇到过这个或确定了解决方案?

解决了问题。我没有考虑返回像素的 rowStride。所以我不得不运行一个for循环在保存之前提取非填充数据:

myRowStride = mImage.getPlanes()[0].getRowStride();
int iSkippedBytes = 0;
for (int i = 0; i < mStillSize.getWidth() * mStillSize.getHeight(); i++){
    if (i % mStillSize.getWidth() == 0 && i != 0)
          iSkippedBytes = iSkippedBytes + (myRowStride - mStillSize.getWidth());
    imageBytes[i] = bytes[i + iSkippedBytes];
 }