保存I420Frame(NV21 to JPEG)

 public static android.graphics.YuvImage ConvertTo(org.webrtc.VideoRenderer.I420Frame src, int imageFormat) {
        byte[] bytes = new byte[src.yuvStrides[0] * src.height +
                src.yuvStrides[1] * src.height / 2 +
                src.yuvStrides[2] * src.height / 2];
        int[] strides = new int[3];
        switch (imageFormat) {
            default:
                return null;
            case android.graphics.ImageFormat.YV12: {
                ByteBuffer tmp = ByteBuffer.wrap(bytes, 0, src.yuvStrides[0] * src.height);
                copyPlane(src.yuvPlanes[0], tmp);
                tmp = ByteBuffer.wrap(bytes, src.yuvStrides[0] * src.height, src.yuvStrides[2] * src.height / 2);
                copyPlane(src.yuvPlanes[2], tmp);
                tmp = ByteBuffer.wrap(bytes, src.yuvStrides[0] * src.height + src.yuvStrides[2] * src.height / 2, src.yuvStrides[1] * src.height / 2);
                copyPlane(src.yuvPlanes[1], tmp);
                strides[0] = src.yuvStrides[0];
                strides[1] = src.yuvStrides[2];
                strides[2] = src.yuvStrides[1];
                return new YuvImage(bytes, imageFormat, src.width, src.height, strides);
            }

            case android.graphics.ImageFormat.NV21: {
                if (src.yuvStrides[0] != src.width)
                    return null;
                if (src.yuvStrides[1] != src.width / 2)
                    return null;
                if (src.yuvStrides[2] != src.width / 2)
                    return null;

                ByteBuffer tmp = ByteBuffer.wrap(bytes, 0, src.width * src.height);
                copyPlane(src.yuvPlanes[0], tmp);

                byte[] tmparray = new byte[src.width / 2 * src.height / 2];
                tmp = ByteBuffer.wrap(tmparray, 0, src.width / 2 * src.height / 2);

                copyPlane(src.yuvPlanes[2], tmp);
                for (int row = 0; row < src.height / 2; row++) {
                    for (int col = 0; col < src.width / 2; col++) {
                        bytes[src.width * src.height + row * src.width + col * 2] = tmparray[row * src.width / 2 + col];
                    }
                }
                copyPlane(src.yuvPlanes[1], tmp);
                for (int row = 0; row < src.height / 2; row++) {
                    for (int col = 0; col < src.width / 2; col++) {
                        bytes[src.width * src.height + row * src.width + col * 2 + 1] = tmparray[row * src.width / 2 + col];
                    }
                }
                return new YuvImage(bytes, imageFormat, src.width, src.height, null);
            }

        }
    }

调用方法

android.graphics.YuvImage yuvImage = ConvertTo(i420Frame, ImageFormat.NV21);
FileOutputStream fileOutputStream = new FileOutputStream(file);
yuvImage.compressToJpeg(new Rect(0, 0, yuvImage.getWidth(), yuvImage.getHeight()), 100, fileOutputStream);

你可能感兴趣的:(保存I420Frame(NV21 to JPEG))