便携式 YUV 绘图上下文

Portable YUV Drawing Context

我有一个 YUV 数据流(来自视频文件),我想将其实时流式传输到屏幕。 (基本上,我想写一个实时播放视频的程序。)

因此,我正在寻找一种将 YUV 数据发送到屏幕的便携方式。理想情况下,我想使用一些可移植的东西,这样我就不必为每个主要平台重新实现它。

我找到了几个选项,但它们似乎都有重大问题。他们是:

  1. 直接使用OpenGL,将YUV数据转换为RGB。 (并为整个屏幕技巧使用单个四边形。)

这显然行不通,因为在 CPU 上将 RGB 转换为 YUV 对于实时显示图像来说太慢了。

  1. 使用 OpenGL,但使用着色器将 YUV 流转换为 RGB。

这个选项好一点。 Although the problem here is that (afaict), this will involve making two streams and splicing them together. It might work, but may have issues with larger resolutions.

  1. 而是使用 SDL,它可以选择直接创建 YUV 上下文。

这个问题是我已经在我的程序的其他方面(例如播放控件)使用跨平台小部件库。据我所知,SDL 仅在 (possibly borderless) window 上打开。理想情况下,我希望我的控件和绘图上下文在同一个 window 中。我可以使用 opengl,但不能使用 SDL。

  1. 使用 SDL,并为屏幕小部件使用 Qt 之类的东西,使用消息传递协议在两个库之间进行通信。 Have the (borderless) SDL window constantly move itself on top of the opengl window.

虽然这种方法很聪明,但似乎这两个 windows 可以轻松摆脱困境,从而使用户体验欠佳。

  1. 忘记跨平台库,想想OS具体的,如果存在的话使用硬件加速。

虽然不是跨平台的,但这是一个很好的解决方案。

因此,有什么好的方法可以将 YUV 数据绘制到理想情况下的屏幕上:

  1. Portable (at least to the major platforms).
  2. Fast enough to be real time.
  3. Allows other widgets in the same window.

使用选项2。在着色器中进行YUV到RGB的转换没有问题。没有其他 "portable" 方法可以做到这一点。

这样想:无论 "how big or small" 您的视频是什么,片段着色器(完成转换的地方)都会在显示时按像素执行,因此您可以在全屏或大屏幕,计算(对于着色器)是相同的,因为它们显示相同数量的像素。

正常情况下任何显卡都可以运行这种着色器没有任何问题。