上面两个函数的目标都是将NV21格式的数据转换为YUV420P格式,但是它们在处理U和V分量的方式上有所不同。
在第一个函数NV21toYUV420P_1
中,U和V分量的处理方式是这样的:对于U分量,它从NV21数据的Y分量之后的每个奇数位置取数据;对于V分量,它从NV21数据的Y分量之后的每个偶数位置取数据。
而在第二个函数NV21toYUV420P
中,U和V分量的处理方式是这样的:对于U分量,它从NV21数据的Y分量之后的每个偶数位置取数据;对于V分量,它从NV21数据的Y分量之后的每个奇数位置取数据。
因此,这两个函数并不完全相同。如果你的NV21数据是标准的,即V和U分量是交错存储的(首先是V,然后是U),那么你应该使用第二个函数NV21toYUV420P
。
java
private byte[] NV21toYUV420P_1(byte[] nv21, int width, int height) {
byte[] yuv420p = new byte[widthheight3/2];
int i, j;
int ySize = width * height;
// 拷贝Y分量
System.arraycopy(nv21, 0, yuv420p, 0, ySize);
// 处理并拷贝U分量
for (i = 0; i < ySize/4; i++) {
yuv420p[ySize + i] = nv21[ySize + 2 * i + 1];
}
// 处理并拷贝V分量
for (j = 0; j < ySize/4; j++) {
yuv420p[ySize + i + j] = nv21[ySize + 2 * j];
}
return yuv420p;
}
public static byte[] NV21toYUV420P(byte[] nv21, int width, int height) {
byte[] yuv420p = new byte[width*height*3/2];
int i, j;
int ySize = width * height;
// Copy Y
System.arraycopy(nv21, 0, yuv420p, 0, ySize);
// Copy U and V
for (i = 0; i < ySize/2; i += 2) {
yuv420p[ySize + i/2] = nv21[ySize + i]; // U
yuv420p[ySize + ySize/4 + i/2] = nv21[ySize + i + 1]; // V
}
return yuv420p;
}