NV12与NV21的区别主要在于UV(色度)通道的排列顺序:
换句话说,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相同大小的字节数组)。width
和 height
是图像的尺寸。请注意,为了简化,此代码不考虑对齐或步幅。如果您的YUV数据有额外的填充或对齐,您可能需要进行一些额外的调整。
使用:
byte[] nv21 = new byte[ba.length];
convertNV12toNV21(ba,nv21,1280,720);