【问题标题】:Portable YUV Drawing Context便携式 YUV 绘图上下文
【发布时间】:2017-05-31 18:11:37
【问题描述】:

我有一个要实时流式传输到屏幕的 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) 窗口中打开。理想情况下,我希望我的控件和绘图上下文位于同一个窗口中。我可以用 opengl 做,但不能用 SDL。

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

虽然这种方法很聪明,但两个窗口似乎很容易脱离接收器,从而使用户体验欠佳。

  1. 忘记跨平台库,只考虑操作系统特定的,如果存在的话,利用硬件加速。

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

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

  1. 便携(至少适用于主要平台)。
  2. 足够快,可以实时处理。
  3. 允许同一窗口中的其他小部件。

【问题讨论】:

  • 使用 #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


【解决方案1】:

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

这样想:无论您的视频“有多大或多小”,片段着色器(完成转换的地方)都会在显示的那一刻按像素执行,因此您可以拥有完整的小视频屏幕或大屏幕,计算(对于着色器)是相同的,因为它们显示相同数量的像素。

任何显卡在正常情况下都可以毫无问题地运行这种着色器。

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2011-02-20
    • 2016-06-20
    • 2011-03-06
    相关资源
    最近更新 更多