Android NV12转NV21

NV12与NV21的区别主要在于UV(色度)通道的排列顺序:

  • NV12: YYYYYYYY UVUV
  • NV21: YYYYYYYY VUVU

换句话说,NV12的U和V是交替排列的,而NV21则相反。

要将NV12转换为NV21,您只需交换U和V的值。以下是一个简单的Java代码片段,演示如何执行此操作:

public static void convertNV12toNV21(byte[] nv12, byte[] nv21, int width, int height) {
    int size = width * height;
    int offset = size;
    
    // copy Y channel as it is
    System.arraycopy(nv12, 0, nv21, 0, offset);
    
    for (int i = 0; i < size / 4; i++) {
        nv21[offset + (i * 2) + 1] = nv12[offset + (i * 2)];       // U
        nv21[offset + (i * 2)] = nv12[offset + (i * 2) + 1];       // V
    }
}

在上述方法中:

  • nv12 是原始的NV12数据。
  • nv21 是转换后的NV21数据(需要预先分配与NV12相同大小的字节数组)。
  • widthheight 是图像的尺寸。

请注意,为了简化,此代码不考虑对齐或步幅。如果您的YUV数据有额外的填充或对齐,您可能需要进行一些额外的调整。

使用:

    byte[] nv21 = new byte[ba.length];
    convertNV12toNV21(ba,nv21,1280,720);

你可能感兴趣的:(android)