最近项目有个需求,实现在一个界面上两个窗口同时预览Camera的内容,Android中摄像头只能被一个SurfaceView调用,后来想了个办法:在摄像头的预览回调函数(mCamera.setPreviewCallback)中获取每一帧图像的数据,这些数据是YUV格式的,软解码成RGB,然后生成Bitmap,在界面中加一个ImageView,不停的用生成的Bitmap去更新ImageView,这样做可以实现我想要的效果,但是耗费资源比较大,图片延迟也大,大家有什么好的方法可以实现吗?Mediacodec能否更好的解码?该怎么做呢?
解码的方法:
public static int[] convertYUVtoRGB(byte[] yuv, int width, int height) throws NullPointerException, IllegalArgumentException {
int[] out = new int[width * height];
int sz = width * height;
int i, j;
int Y, Cr = 0, Cb = 0;
for (j = 0; j < height; j++) {
int pixPtr = j * width;
final int jDiv2 = j >> 1;
for (i = 0; i < width; i++) {
Y = yuv[pixPtr];
if (Y < 0)
Y += 255;
if ((i & 0x1) != 1) {
final int cOff = sz + jDiv2 * width + (i >> 1) * 2;
Cb = yuv[cOff];
if (Cb < 0)
Cb += 127;
else
Cb -= 128;
Cr = yuv[cOff + 1];
if (Cr < 0)
Cr += 127;
else
Cr -= 128;
}
int R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
if (R < 0)
R = 0;
else if (R > 255)
R = 255;
int G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1)
+ (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
if (G < 0)
G = 0;
else if (G > 255)
G = 255;
int B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
if (B < 0)
B = 0;
else if (B > 255)
B = 255;
out[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R;
}
}
return out;
}
自己顶一下!