【问题标题】:how to covert Y,U,V buffer to one-dimensional array如何将 Y、U、V 缓冲区转换为一维数组
【发布时间】:2019-06-15 16:42:15
【问题描述】:

我正在尝试将 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数组转换为一维数组的正确方法是什么?

【问题讨论】:

    标签: c++ yuv openh264


    【解决方案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);
    }
    

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

    我刚才看到你使用的是 YUV420。然后就可以用这个sn-p

    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 值被使用了两次。

    【讨论】:

    • YUV422 不是“YUYV-YUYV...”吗?但是您的代码使用“YYUV-YYUV”?你是不是弄错了?
    • 链接中的注释说“每四个字节是两个 Y,一个 Cb 和一个 Cr。”但在代码中它是 YUYV。你说的对。我修好了
    • 顺便说一句,我如何计算'l'? for(i = 0; i
    • @Pittie 这与您在代码 sn-p 中的 l 相同。 l 是像素数 bufferInfo.UsrData.sSystemBuffer.iWidth*bufferInfo.UsrData.sSystemBuffer.iHeight
    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多