Y'UV420p(和Y'V12或YV12)至RGB888转换(Y'UV420

2019-10-21 01:41发布

我试图以显示Android的一个YUV视频文件,我有我使用的几个YUV视频文件。

该视频文件的YUV VIDEO1 (160 * 120分辨率)是一个从我的服务器作为原始数据H264捕获并转换使用OpenH264到YUV文件。

我用YUV播放器的豪华打上面的YUV视频文件,它起着非常清楚。

当我尝试在Android的播放相同的我没有得到颜色成分回放图像properly.The几乎出现黑色和白色颜色的图像帧之间的一些痕迹。

要显示的Android视频,我就是这样做是由帧,其中每个帧是大小=读出的YUV视频文件帧(W * H * 1.5)个字节,将获得RGB阵列出的是使用下述代码

public static int[] convertYUV420_NV21toARGB8888(byte [] data, int width, int height) {
int size = width*height;
int offset = size;
int[] pixels = new int[size];
int u, v, y1, y2, y3, y4;

// i along Y and the final pixels
// k along pixels U and V
for(int i=0, k=0; i < size; i+=2, k+=2) {
    y1 = data[i  ]&0xff;
    y2 = data[i+1]&0xff;
    y3 = data[width+i  ]&0xff;
    y4 = data[width+i+1]&0xff;

    v = data[offset+k  ]&0xff;
    u = data[offset+k+1]&0xff;
    v = v-128;
    u = u-128;

    pixels[i  ] = convertYUVtoARGB(y1, u, v);
    pixels[i+1] = convertYUVtoARGB(y2, u, v);
    pixels[width+i  ] = convertYUVtoARGB(y3, u, v);
    pixels[width+i+1] = convertYUVtoARGB(y4, u, v);

    if (i!=0 && (i+2)%width==0)
        i += width;
}

return pixels;
}

private static int convertYUVtoARGB(int y, int u, int v) {
int r = y + (int)(1.772f*v);
int g = y - (int)(0.344f*v + 0.714f*u);
int b = y + (int)(1.402f*u);
r = r>255? 255 : r<0 ? 0 : r;
g = g>255? 255 : g<0 ? 0 : g;
b = b>255? 255 : b<0 ? 0 : b;
return 0xff000000 | (r<<16) | (g<<8) | b;
}

使用RGB从mehod convertYUV420_NV21toARGB8888得到[]以上我构造的位图中的ImageView显示量。

我尝试了各种其它代码转换YUV []为rgb [],但结果是一样的。 我也尝试使用机器人会YUVImage API,结果又是一样的。

我知道,上述的代码是Y'UV420sp(NV21)转换为ARGB8888,但我没有得到的差值为RGB YUV和Y'UV420sp(NV21)到ARGB8888转换(只是以前的链接下面....)

请任何人都可以帮我....

Answer 1:

如你预期你的主要问题是,你把输入数据作为NV21,而不是作为YUV。 这两种格式之间的差别在于,在NV21格式色度(U / V)样品进行交织(即VUVUVUVUVU ...)和YUV格式它们在不同的平面(即UUUUU ... VVVVV ...)和另一个顺序所以你这部分代码应该是这样的:

u = data[offset+k  ]&0xff;
v = data[offset+k + size/4]&0xff;

并且k在循环应该增加1(不是2)。



文章来源: Y'UV420p (and Y'V12 or YV12) to RGB888 conversion