首页 > 两个窗口同时预览摄像头的内容

两个窗口同时预览摄像头的内容

最近项目有个需求,实现在一个界面上两个窗口同时预览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;
    }

自己顶一下!

【热门文章】
【热门文章】