【问题标题】:High performance graphical overlay on a YUV (UYVY) image (C++)YUV (UYVY) 图像 (C++) 上的高性能图形叠加
【发布时间】:2015-11-03 22:00:22
【问题描述】:

我的要求:尽快将图形(带有 alpha/抗锯齿)叠加到 UYVY 图像上。渲染必须在 UYVY 中进行,因为我需要同时渲染和编码(H.264 和 ffmpeg)。

我应该使用什么框架(最好是跨平台,但仅限 Windows)来渲染图像以供以后渲染/编码?

我查看了openvc,似乎绘图发生在BGR中,这需要将每个帧从UYVY(2通道)转换为BGR(3通道),然后再转换回来。

我查看了使用硬件加速的 SDL。它支持具有不同颜色空间的多种纹理。但是,我需要得到合成图像的方法 SDL_RenderReadPixels 在文档中提到“警告这是一个非常慢的操作,不应该经常使用。”

是否有一个框架可以绘制到 YUV 的 BYTE 数组上,可以使用 alpha 混合/抗锯齿?

【问题讨论】:

  • 大多数“快速”YUV(有硬件支持)存储为 Y、U、V 的“块”。所以不是线性形式。大多数硬件将支持快速绘制此类表面。但是,我认为您的问题不是软件框架之一,而是找到满足您需求的软件和硬件的组合。
  • 您可以使用互操作 OpenCL / CUDA 内核设置 OpenGL,您可以在缓冲区中传递 YUV 值,然后计算新的纹理输出。内核动态转换每个像素的值(以 RGB(A) 格式存储),以便可以渲染它。这可以并行完成,尽管需要一些调整才能找到正确的同步平衡。 FreeImage 不支持它,但 libyuv 可能正是你想要的。

标签: c++ rendering yuv


【解决方案1】:

您还可以将 YUV 转换为 BGRA。然后使用格式进行绘图操作。 BGRA 比 BGR 更方便绘图,因为它的每个像素都等于 32 位整数。画完后自然要向后转 BGRA 到 YUV。

有一个快速的跨平台 C++ library 可以执行这些操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2021-03-21
    • 2010-12-07
    • 2017-08-23
    • 1970-01-01
    • 2018-12-25
    • 2013-02-09
    相关资源
    最近更新 更多