我试图以显示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转换(只是以前的链接下面....)
请任何人都可以帮我....