2

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

4

1 回答 1

2

你需要 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 值使用两次。

于 2019-01-22T09:12:00.573 回答