使用openGL的视频显示

Posted

技术标签:

【中文标题】使用openGL的视频显示【英文标题】:Video display with openGL 【发布时间】:2010-06-18 15:02:01 【问题描述】:

我想用 OpenGL 直接显示非常高分辨率的视频。

图像数据将在 GPU 上进行处理,我希望避免往返 PC 以在基于标准位图的窗口中显示视频。 跨平台很好,只有 Windows 可以(只有 nvidia 也可以)

任何人都可以链接到这样做的方法吗?

在 Qt 中有一个糟糕的 NeHe 教程和一些嵌入式 OpenGL 小部件的示例,但我需要更好的性能和更大的图像。

【问题讨论】:

【参考方案1】:

假设 OpenGL 2.1,使用 GL_PIXEL_UNPACK_BUFFER 类型的缓冲区对象将像素数据流式传输到纹理。它比每帧上传数据要快,因为当您使用 glMapBuffer、glMapBufferRange (OpenGL 3.2) 或直接调用 glBufferData 时,实现可能会使用 DMA 进行复制。您还可以在每个批次中复制多个帧,以在复制开销和映射开销之间进行权衡。最后,创建一个着色器,将 YUV 或 YCbCr 转换为 RGB,并用三角形条带显示纹理。

【讨论】:

全屏四边形上方的三角形有什么原因吗? 是的,四边形在各个方面都很糟糕,不应该使用,忘记它们曾经存在过。【参考方案2】:

与 OpenGL 相关的显而易见的事情是将位图显示为纹理。

【讨论】:

是的 - 我只是想知道是否有一些视频特定的性能技巧,而不是仅仅将每一帧复制到一个全屏四边形 @Martin:通常不会——只要你保持卡本身的所有内存洗牌,几乎任何合理的视频卡都可以很容易地提供带宽来重写屏幕上的每一位最大刷新率(尤其是现在,因为 LCD 的刷新速度几乎从不超过 60 Hz —— 刷新 100+ Hz 的高端 CRT 更难)。 这就是问题所在 - 我需要在 120Hz 下进行 1080p(最好是其中两个!) @Martin:无论如何,我不会太在意它是个问题。我使用由 Pentium III 驱动的 GeForce 5800 设法跟上 ~100 Hz 的刷新。分辨率有点低,但不是很大,现代显卡的速度是原来的两倍多。【参考方案3】:

所以您想在纹理上发送视频并使用片段着色器对其进行处理? Here's 一个简短的教程如何做类似的事情。这只是一个简单的 OpenGL 2.0 示例,它创建 2 个窗口大小的纹理并将它们混合在片段着色器中。不涉及任何视频,但如果您已经有办法对其进行解码,则应该不难修改。

【讨论】:

以上是关于使用openGL的视频显示的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL API 播放 BIK 视频

从 OpenGL C 程序生成视频

Android OpenGL 播放视频学习

OpenGL ES 1.1 - alpha 蒙版

使用 OpenGL 显示 YUY2 (Y'UV422)

OpenGL - 矩阵逻辑错误