【发布时间】:2017-05-31 18:11:37
【问题描述】:
我有一个要实时流式传输到屏幕的 YUV 数据流(来自视频文件)。 (基本上,我想写一个实时播放视频的程序。)
因此,我正在寻找一种将 YUV 数据发送到屏幕的便携方式。理想情况下,我希望使用可移植的东西,这样我就不必为每个主要平台重新实现它。
我找到了一些选项,但它们似乎都存在重大问题。它们是:
- 直接使用 OpenGL,将 YUV 数据转换为 RGB。 (并在整个屏幕技巧中使用单个四边形。)
这显然行不通,因为在 CPU 上将 RGB 转换为 YUV 对于实时显示图像来说太慢了。
- 使用 OpenGL,但使用着色器将 YUV 流转换为 RGB。
- 改为使用 SDL,它可以选择直接创建 YUV 上下文。
这个问题是我已经在我的程序的其他方面(例如播放控件)使用跨平台小部件库。据我所知,SDL 仅在其 (possibly borderless) 窗口中打开。理想情况下,我希望我的控件和绘图上下文位于同一个窗口中。我可以用 opengl 做,但不能用 SDL。
- 使用 SDL,并为屏幕小部件使用 Qt 之类的东西,使用消息传递协议在两个库之间进行通信。 Have the (borderless) SDL window constantly move itself on top of the opengl window.
虽然这种方法很聪明,但两个窗口似乎很容易脱离接收器,从而使用户体验欠佳。
- 忘记跨平台库,只考虑操作系统特定的,如果存在的话,利用硬件加速。
这是一个很好的解决方案,虽然它不是跨平台的。
因此,有什么好的方法可以将 YUV 数据绘制到理想的屏幕上:
- 便携(至少适用于主要平台)。
- 足够快,可以实时处理。
- 允许同一窗口中的其他小部件。
【问题讨论】:
-
使用 #2:使用 1 或 3 个(取决于 YUV 数据的平面性)纹理并在渲染纹理四边形时在片段着色器中进行 YUV -> RGB 转换。 SDL_Renderer 做到了behind the scenes。
-
另外,回复:CPU 端颜色转换:
libswscale,参见ffplay中的用法。 -
Facepalm,谢谢你们。尤其是@genpfault,我现在感觉有点傻,因为我已经在应用程序中使用了 ffmpeg...
-
“在 CPU 上将 RGB 转换为 YUV 太慢了”:你怎么知道?
标签: opengl graphics ffmpeg sdl sdl-2