便携式YUV绘图上下文

时间:2017-05-31 18:11:38

标签: opengl graphics ffmpeg sdl sdl-2

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

因此,我正在寻找一种将YUV数据发送到屏幕的便携方式。我理想的是喜欢使用便携式设备,所以我不必为每个主要平台重新实现它。

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

  1. 直接使用OpenGL,将YUV数据转换为RGB。 (并使用单一四边形作为整个屏幕技巧。)
  2. 这显然不会起作用,因为在CPU上将RGB转换为YUV对于实时显示图像来说太慢了。

    1. 使用OpenGL,但使用着色器将YUV流转换为RGB。
    2. 这个选项好一点。 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上下文。
      2. 这个问题是我已经在我的程序的其他方面使用跨平台小部件库(例如播放控件)。据我所知,SDL只在其开启(possibly borderless)窗口中打开。理想情况下,我希望我的控件和绘图上下文位于同一窗口中。我可以用opengl做什么,但不能用SDL做。

        1. 使用SDL,并在屏幕小部件上使用Qt之类的东西,使用消息传递协议在两个库之间进行通信。 Have the (borderless) SDL window constantly move itself on top of the opengl window.
        2. 虽然这种方法很聪明,但似乎这两个窗口很容易脱离,使用户体验不理想。

          1. 忘记跨平台库,确实考虑操作系统,如果存在则使用硬件加速。
          2. 虽然这不是跨平台,但这是一个很好的解决方案。

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

              
                
            1. 便携式(至少对主要平台而言)。
            2.   
            3. 足够快到实时。
            4.   
            5. 允许在同一窗口中显示其他小部件。
            6.   

1 个答案:

答案 0 :(得分:1)

使用选项编号2.在着色器中进行YUV到RGB转换没有问题。没有其他的便携式"这样做的方法。

这样想:不管"多大或多小"您的视频是,片段着色器(转换完成的位置)将在显示时按像素执行,因此您可以使用全屏或大屏幕的小视频,计算(对于着色器)是相同的,因为它们显示相同数量的像素。

正常条件下的任何视频卡都可以毫无问题地运行这种着色器。