2

我必须将几个完整的 PAL 视频 (720x576@25) 从 YUV 4:2:2 实时转换为 RGB,并且可能对每个视频进行自定义调整大小。我已经考虑过使用 GPU,因为我已经看到了一些这样做的例子(除了它是 4:4:4,所以 bpp 在源和命运上是相同的)——http: //www.fourcc.org/源码/YUV420P-OpenGL-GLSLang.c

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

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

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

4

2 回答 2

2

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

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

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

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

DirectX 和 OpenGL 都有关于使用窗口表面作为渲染目标的很好的教程。

于 2010-03-30T13:18:50.747 回答
2

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

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

于 2010-03-30T13:56:23.743 回答