如何将Y,U,V缓冲区转换为一维数组

时间:2019-01-22 08:50:36

标签: c++ yuv openh264

我正在尝试将hls文件转换为jpeg。首先,我使用openh264将HLS文件转换为YUV。我得到一个包含Y,U,V缓冲区(* pData [3])的二维数组。之后,我尝试将三个数组合并为一个数组,以将其传递给CompressYUYV2JPEG。 这是我的转换方式:

for(i = 0; i < l; i++) {
        inbuf.push_back(yuvData[0][i]);
    }
    l = bufferInfo.UsrData.sSystemBuffer.iWidth*bufferInfo.UsrData.sSystemBuffer.iHeight/4;
    for(i = 0; i < l; i++) {
        inbuf.push_back(yuvData[1][i]);
    }
    l = bufferInfo.UsrData.sSystemBuffer.iWidth*bufferInfo.UsrData.sSystemBuffer.iHeight/4;
    for(i = 0; i < l; i++) {
        inbuf.push_back(yuvData[2][i]);
    }

但不幸的是,它没有产生预期的结果。将二维YUV数组转换为一维数组的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您需要YUV422。那就是YUYV。每个输入数据的inbuf必须除以4。您可以使用

for(i = 0; i < l/2; i++) {
    inbuf.push_back(yuvData[0][2*i]);
    inbuf.push_back((yuvData[1][2*i] + yuvData[1][2*i + 1])/2);
    inbuf.push_back(yuvData[0][2*i + 1]);
    inbuf.push_back((yuvData[2][2*i] + yuvData[2][2*i + 1])/2);
}

在此代码段中,使用了所有Y值,但仅使用了两个Cr的平均值。使用Cb值。当然,每个yuvData通道中的元素数量必须是偶数。否则,您必须找到最后一个元素的解决方案。

我刚刚看到您使用YUV420。然后您可以使用此代码段

for(i = 0; i < l/2; i++) {
    inbuf.push_back(yuvData[0][2*i]);
    inbuf.push_back(yuvData[1][i/2]);
    inbuf.push_back(yuvData[0][2*i + 1]);
    inbuf.push_back(yuvData[2][i/2]);
}

在此代码中,所有Y值都使用一次,所有Cr分别使用。 Cb值使用了两次。