我必须将几个完整的 PAL 视频 (720x576@25) 从 YUV 4:2:2 实时转换为 RGB,并且可能需要对每个视频进行自定义调整大小。我曾想过使用 GPU,因为我见过一些这样做的示例(除了它是 4:4:4,因此 bpp 在源和命运中是相同的)-- http://www.fourcc.org/source/YUV420P-OpenGL-GLSLang.c

但是,我没有任何使用 GPU 的经验,并且不确定可以做什么。据我了解,该示例只是将视频帧转换为 YUV 并将其显示在屏幕上。

是否可以获取处理后的帧?是否值得付出努力将其发送到 GPU、对其进行转换,然后再次将其发送到主内存,还是会降低性能?

有点特定于平台,假设我在 Windows 上工作,是否可以从窗口获取 OpenGL 或 DirectDraw 表面,以便 GPU 可以直接绘制到它?

有帮助吗?

解决方案

真正的问题是,你希望从中得到什么?

在您接收视频的帧速率下,您可以使用英特尔性能基元之类的工具来执行您需要的几个操作并轻松跟上流。

如果您想学习如何进行 GPU 编程,这是您可以实现的一个很好的简单问题。

可以通过从 GPU 读回内存来获取处理后的帧。实际机制将根据您使用的 API(OpenGL、DirectX、CUDA、OpenCL)而有所不同。我已经用更高分辨率的视频做到了这一点,并且仍然保持 25fps 的流。但是,这一切都取决于您将使用的硬件。

DirectX 和 OpenGL 都有关于使用 Windows 表面作为渲染目标的精彩教程。

其他提示

我实际上已经用 C 语言为 CUDA 编写了这个程序,并用 C 语言编写了 pthreads 程序。(不过,请注意,只是为了好玩。)而且我发现 GPU 的运行速度非常快,即使每次都完全填满 GPU 的内存,您也要花费 50-80% 的时间来回发送数据。因此,CPU 完成这项工作的速度几乎与 GPU 一样快。正如您可能已经发现的那样,这个问题对线程非常友好,因此对于现代硬件,内存带宽是最大的问题。

我使用 Core i7 作为 CPU、GeForce 8800GT/GTX 285 作为显卡进行了测试。GTX285 可以处理 1500fps 的 1920x1080 视频,因此无论您选择什么,速度都会快得惊人。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top