gpt4 book ai didi

rgb - 需要从 RGB 帧创建 webm 视频

转载 作者:行者123 更新时间:2023-11-30 23:54:09 26 4
gpt4 key购买 nike

我有一个应用程序可以生成一堆 jpg,我需要将这些 jpg 转换为 webm 视频。我正在尝试将 jpeg 中的 rgb 数据放入 vpxenc 示例中。我可以在输出视频中看到原始 jpg 的基本形状,但所有内容都呈绿色(即使应该是黑色的像素也大约是绿色的一半),并且每个其他扫描线中都有一些垃圾。

我正在尝试向它提供 VPX_IMG_FMT_YV12 数据,我假设它的结构如下:

对于每一帧
8 位 Y 数据
每个 2x2 V 块的 8 位平均值
每个 2x2 U 块的 8 位平均值

这是源图像和即将发布的视频的屏幕截图:

Images

我完全有可能错误地进行 RGB->YV12 转换,但即使我只对 8 位 Y 数据进行编码并将 U 和 V 块设置为 0,视频看起来也大致相同。我基本上是通过这个等式运行我的 RGB 数据:

// (R, G, and B are 0-255)
float y = 0.299f*R + 0.587f*G + 0.114f*B;
float v = (R-y)*0.713f;
float u = (B-v)*0.565f;

.. 然后为我写入 vpxenc 的 U 和 V 生成 2x2 过滤值,我只是执行 (a + b + c + d)/4,其中 a、b、c、d 是 U 或 V 值每个 2x2 像素块。

所以我想知道:
  • 有没有更简单的方法(在代码中)来获取 RGB 数据并将其提供给 vpx_codec_encode 以获得不错的 webm 视频?
  • 我的 RGB->YV12 转换在某处有问题吗?

  • 任何帮助将不胜感激。

    最佳答案

    自由落体者:当然。这是代码。请注意,它正在转换 RGB->YUV 并将 YV12 输出放入 pFullYPlane/pDownsampledUPlane/pDownsampledVPlane。当我修改他们的 vpxenc 示例以使用此数据时,此代码生成了漂亮的 WebM 视频。

    void RGB_To_YV12( unsigned char *pRGBData, int nFrameWidth, int nFrameHeight, void *pFullYPlane, void *pDownsampledUPlane, void *pDownsampledVPlane )
    {
    int nRGBBytes = nFrameWidth * nFrameHeight * 3;

    // Convert RGB -> YV12. We do this in-place to avoid allocating any more memory.
    unsigned char *pYPlaneOut = (unsigned char*)pFullYPlane;
    int nYPlaneOut = 0;

    for ( int i=0; i < nRGBBytes; i += 3 )
    {
    unsigned char B = pRGBData[i+0];
    unsigned char G = pRGBData[i+1];
    unsigned char R = pRGBData[i+2];

    float y = (float)( R*66 + G*129 + B*25 + 128 ) / 256 + 16;
    float u = (float)( R*-38 + G*-74 + B*112 + 128 ) / 256 + 128;
    float v = (float)( R*112 + G*-94 + B*-18 + 128 ) / 256 + 128;

    // NOTE: We're converting pRGBData to YUV in-place here as well as writing out YUV to pFullYPlane/pDownsampledUPlane/pDownsampledVPlane.
    pRGBData[i+0] = (unsigned char)y;
    pRGBData[i+1] = (unsigned char)u;
    pRGBData[i+2] = (unsigned char)v;

    // Write out the Y plane directly here rather than in another loop.
    pYPlaneOut[nYPlaneOut++] = pRGBData[i+0];
    }

    // Downsample to U and V.
    int halfHeight = nFrameHeight >> 1;
    int halfWidth = nFrameWidth >> 1;

    unsigned char *pVPlaneOut = (unsigned char*)pDownsampledVPlane;
    unsigned char *pUPlaneOut = (unsigned char*)pDownsampledUPlane;

    for ( int yPixel=0; yPixel < halfHeight; yPixel++ )
    {
    int iBaseSrc = ( (yPixel*2) * nFrameWidth * 3 );

    for ( int xPixel=0; xPixel < halfWidth; xPixel++ )
    {
    pVPlaneOut[yPixel * halfWidth + xPixel] = pRGBData[iBaseSrc + 2];
    pUPlaneOut[yPixel * halfWidth + xPixel] = pRGBData[iBaseSrc + 1];

    iBaseSrc += 6;
    }
    }
    }

    关于rgb - 需要从 RGB 帧创建 webm 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765436/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com