Opengl 便携式YUV绘图环境

Opengl 便携式YUV绘图环境,opengl,graphics,ffmpeg,sdl,sdl-2,Opengl,Graphics,Ffmpeg,Sdl,Sdl 2,我有一个YUV数据流(来自视频文件),我想实时流到屏幕上。(基本上,我想编写一个实时播放视频的程序。) 因此,我正在寻找一种将YUV数据发送到屏幕的便携式方法。理想情况下,我希望使用便携设备,这样我就不必为每个主要平台重新实现它 我找到了一些选择,但它们似乎都有重大问题。它们是: 直接使用OpenGL,将YUV数据转换为RGB。(并在整个屏幕上使用单个四元组。) 这显然行不通,因为在CPU上将RGB转换为YUV对于实时显示图像来说太慢了 使用OpenGL,但使用着色器将YUV流转换为RGB 这个

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

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

我找到了一些选择,但它们似乎都有重大问题。它们是:

  • 直接使用OpenGL,将YUV数据转换为RGB。(并在整个屏幕上使用单个四元组。)

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

  • 使用OpenGL,但使用着色器将YUV流转换为RGB
  • 这个选项好一点

  • 而是使用SDL,它可以选择直接创建YUV上下文
  • 问题是我已经在使用一个跨平台的小部件库来实现程序的其他方面(比如播放控件)。据我所知,SDL只在其on()窗口中打开。理想情况下,我希望控件和绘图上下文位于同一窗口中。我可以用opengl,但不能用SDL

  • 对于屏幕上的小部件,可以使用SDL,也可以使用类似Qt的东西,使用消息传递协议在两个库之间进行通信 虽然这种方法很聪明,但似乎这两个窗口可以很容易地脱离水槽,从而使用户体验次优

  • 忘记一个跨平台的库,不要认为是操作系统特有的,如果存在的话,利用硬件加速
  • 这是一个很好的解决方案,尽管它不是跨平台的

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

  • 便携式(至少适用于主要平台)
  • 速度足够快,可以实现实时性
  • 允许在同一窗口中使用其他窗口小部件

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

    这样想:无论您的视频“有多大或多小”,片段着色器(进行转换的地方)都将在显示时按像素执行,因此您可以全屏显示小视频或大视频,计算(对于着色器)是相同的,因为它们显示的像素数相同


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

    使用#2:使用1或3(取决于YUV数据的平面度)纹理&在渲染纹理四元体时,在片段着色器中执行YUV->RGB转换。SDL_渲染器可以做到这一点。另外,re:CPU侧颜色转换:,请参阅.Facepalm中的用法,谢谢。尤其是@genpfault,我现在感觉有点傻,因为我已经在应用程序中使用ffmpeg了……”“在CPU上将RGB转换为YUV太慢了”:你怎么知道?