便携式 YUV 绘图上下文
Portable YUV Drawing Context
我有一个 YUV 数据流(来自视频文件),我想将其实时流式传输到屏幕。 (基本上,我想写一个实时播放视频的程序。)
因此,我正在寻找一种将 YUV 数据发送到屏幕的便携方式。理想情况下,我想使用一些可移植的东西,这样我就不必为每个主要平台重新实现它。
我找到了几个选项,但它们似乎都有重大问题。他们是:
- 直接使用OpenGL,将YUV数据转换为RGB。 (并为整个屏幕技巧使用单个四边形。)
这显然行不通,因为在 CPU 上将 RGB 转换为 YUV 对于实时显示图像来说太慢了。
- 使用 OpenGL,但使用着色器将 YUV 流转换为 RGB。
- 而是使用 SDL,它可以选择直接创建 YUV 上下文。
这个问题是我已经在我的程序的其他方面(例如播放控件)使用跨平台小部件库。据我所知,SDL 仅在 (possibly borderless) window 上打开。理想情况下,我希望我的控件和绘图上下文在同一个 window 中。我可以使用 opengl,但不能使用 SDL。
- 使用 SDL,并为屏幕小部件使用 Qt 之类的东西,使用消息传递协议在两个库之间进行通信。 Have the (borderless) SDL window constantly move itself on top of the opengl window.
虽然这种方法很聪明,但似乎这两个 windows 可以轻松摆脱困境,从而使用户体验欠佳。
- 忘记跨平台库,想想OS具体的,如果存在的话使用硬件加速。
虽然不是跨平台的,但这是一个很好的解决方案。
因此,有什么好的方法可以将 YUV 数据绘制到理想情况下的屏幕上:
- Portable (at least to the major platforms).
- Fast enough to be real time.
- Allows other widgets in the same window.
使用选项2。在着色器中进行YUV到RGB的转换没有问题。没有其他 "portable" 方法可以做到这一点。
这样想:无论 "how big or small" 您的视频是什么,片段着色器(完成转换的地方)都会在显示时按像素执行,因此您可以在全屏或大屏幕,计算(对于着色器)是相同的,因为它们显示相同数量的像素。
正常情况下任何显卡都可以运行这种着色器没有任何问题。
我有一个 YUV 数据流(来自视频文件),我想将其实时流式传输到屏幕。 (基本上,我想写一个实时播放视频的程序。)
因此,我正在寻找一种将 YUV 数据发送到屏幕的便携方式。理想情况下,我想使用一些可移植的东西,这样我就不必为每个主要平台重新实现它。
我找到了几个选项,但它们似乎都有重大问题。他们是:
- 直接使用OpenGL,将YUV数据转换为RGB。 (并为整个屏幕技巧使用单个四边形。)
这显然行不通,因为在 CPU 上将 RGB 转换为 YUV 对于实时显示图像来说太慢了。
- 使用 OpenGL,但使用着色器将 YUV 流转换为 RGB。
- 而是使用 SDL,它可以选择直接创建 YUV 上下文。
这个问题是我已经在我的程序的其他方面(例如播放控件)使用跨平台小部件库。据我所知,SDL 仅在 (possibly borderless) window 上打开。理想情况下,我希望我的控件和绘图上下文在同一个 window 中。我可以使用 opengl,但不能使用 SDL。
- 使用 SDL,并为屏幕小部件使用 Qt 之类的东西,使用消息传递协议在两个库之间进行通信。 Have the (borderless) SDL window constantly move itself on top of the opengl window.
虽然这种方法很聪明,但似乎这两个 windows 可以轻松摆脱困境,从而使用户体验欠佳。
- 忘记跨平台库,想想OS具体的,如果存在的话使用硬件加速。
虽然不是跨平台的,但这是一个很好的解决方案。
因此,有什么好的方法可以将 YUV 数据绘制到理想情况下的屏幕上:
- Portable (at least to the major platforms).
- Fast enough to be real time.
- Allows other widgets in the same window.
使用选项2。在着色器中进行YUV到RGB的转换没有问题。没有其他 "portable" 方法可以做到这一点。
这样想:无论 "how big or small" 您的视频是什么,片段着色器(完成转换的地方)都会在显示时按像素执行,因此您可以在全屏或大屏幕,计算(对于着色器)是相同的,因为它们显示相同数量的像素。
正常情况下任何显卡都可以运行这种着色器没有任何问题。