媒体编解码器-YUV_YV12至YUV420SP / NV21

时间:2018-12-05 08:36:07

标签: android opencv encoding mediacodec

我正在尝试开发一个Android应用程序,使用Android媒体编解码器将分辨率为1200x1200 4通道图像的Mats的opencv数组编码为mp4视频。我面临的问题是,当我尝试使用模拟器(使用YUV420P颜色格式-我正在使用OpenCV COLOR_BGRA2YUV_I420转换)时,视频输出颜色与图像数组相同,但是在实际的android设备上颜色输出完全不同,因此我调试后发现我的android设备颜色格式为YUV420SP。由于没有内置的opencv函数将RGBA / BGRA转换为YUV420SP,因此我已使用以下代码将图像转换为YUV_YV12,然后转换为YUV420SP / NV21

public byte[] YV12toNV21(final byte[] input, final int width, final int height) {

        byte[] output = input;

        final int size = width * height;
        final int quarter = size / 4;
        final int vPosition = size; // This is where V starts
        final int uPosition = size + quarter; // This is where U starts

        System.arraycopy(input, 0, output, 0, size); // Y is same

        for (int i = 0; i < quarter; i++) {
            output[size + i*2 ] = input[vPosition + i]; // For NV21, V first
            output[size + i*2 + 1] = input[uPosition + i]; // For Nv21, U second
        }
        return output;
    }

但是我仍然面临着同样的问题。

这是原始RGBA图片 This is the Original RGBA Picture

这是视频的输出 This one is the output of video

更新:

交换U和V后 enter image description here

0 个答案:

没有答案