YUV420p到RGB的转换已将U和V值移位-iOS Unity3D

时间:2018-08-24 20:51:42

标签: c++ unity3d ffmpeg yuv

我在Unity中有一个本机插件,可以使用FFMPEG将H264帧解码为YUV420p。

要显示输出图像,我将YUV值重新排列为RGBA纹理,并使用Unity着色器将YUV转换为RGB(只是为了使其更快)。

以下是我的本机插件中的重新排列代码:

unsigned char* yStartLocation = (unsigned char*)m_pFrame->data[0];
unsigned char* uStartLocation = (unsigned char*)m_pFrame->data[1];
unsigned char* vStartLocation = (unsigned char*)m_pFrame->data[2];

for (int y = 0; y < height; y++)
{
    for (int x = 0; x < width; x++)
    {

        unsigned char* y = yStartLocation + ((y * width) + x);
        unsigned char* u = uStartLocation + ((y * (width / 4)) + (x / 2));
        unsigned char* v = vStartLocation + ((y * (width / 4)) + (x / 2));
        //REF: https://en.wikipedia.org/wiki/YUV

        // Write the texture pixel
        dst[0] = y[0]; //R
        dst[1] = u[0]; //G
        dst[2] = v[0]; //B
        dst[3] = 255;  //A

        // To next pixel
        dst += 4;

        // dst is the pointer to target texture RGBA data
    }
}

将YUV转换为RGB的着色器可以完美工作,我已经在多个项目中使用了它。

现在,我正在使用相同的代码在iOS平台上进行解码。但是由于某些原因,U和V值现在发生了偏移:

Y纹理

enter image description here

U Texture

enter image description here

iOS或OpenGL是否特别缺少什么?

任何帮助,我们将不胜感激。 谢谢!

请注意,我在第一个屏幕截图中填写了R = G = B = Y,在第二个屏幕截图中填写了U(如果可以)

编辑: 这是我得到的输出: enter image description here

Edit2: 根据一些研究,我认为这可能与隔行扫描有关。

ref:Link

目前,我已经使用sws_scale转到基于CPU的YUV-RGB转换,并且工作正常。

1 个答案:

答案 0 :(得分:1)

问题出在这条线上:

uStartLocation + ((y * (width / 4)) + (x / 2));

应该是

uStartLocation + (((y / 2) * (width / 2)) + (x / 2));

由于int舍入导致整个帧移动。尝试优化计算的错误非常愚蠢。

希望它可以帮助某人。