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

标签 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 数组转换为一维数组的正确方法是什么?

最佳答案

您需要 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 channel 中的元素数量必须是偶数。否则你必须找到最后一个元素的解决方案。

我刚刚看到您使用 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 值使用两次。

关于c++ - 如何将 Y,U,V 缓冲区转换为一维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54304417/

相关文章:

c++ - 为什么 C++11 隐式删除了我的默认构造函数?

c++ - c++ 函数签名附加关键字是什么?

c++ - SIMD : Why is the SSE RGB to YUV color conversion about the same speed as the c++ implementation?

c++ - rgb转yuv420算法效率

c++ - 您可以将指针转换为数组吗?

c++ - 提升为命名空间中的自定义小部件

ffmpeg - 使用 qp 将 YUV 编码为 mP4 以获得最高质量

javascript - 未捕获的 TypeError : Module. cwrap 不是函数

android - 为 OpenH264 android 构建 .so 文件