我必须将几个完整的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可以直接绘制到它?
答案 0 :(得分:2)
真正的问题是,你希望从中得到什么?
以您收到视频的帧速率,您可以使用英特尔性能基元之类的功能来执行您需要的几项操作,并轻松跟上流。
如果你想学习如何进行gpu编程,这是一个很容易实现的问题。
可以通过从gpu到内存的回读来获取已处理的帧。实际的机制将根据您使用的API(OpenGL,DirectX,CUDA,OpenCL)而有所不同。我已经用更高分辨率的视频完成了它,并且仍然保持着25fps的流。但是,这一切都取决于您将使用的硬件。
DirectX和OpenGL都有很好的教程,可以将窗口曲面用作渲染目标。
答案 1 :(得分:2)
我实际上已经用C语言为CUDA编程了这个,并且用C语言编写了一个用C语言编写的。(只是为了好玩,但请注意。)我发现GPU工作速度非常快,你花费了50-80%的时间即使您每次都完全填满GPU的内存,也要来回发送数据。因此,CPU完成这项工作的速度与GPU一样快。你可能已经想到了这个问题非常线程友好,所以对于现代硬件,内存带宽是最大的问题。
我用Core i7作为CPU,GeForce 8800GT / GTX 285作为显卡进行了测试。 GTX285处理了1500fps的1920x1080视频,所以无论你选择什么,事情都会非常快。