【问题标题】:SDL 1.3: How to render video with out displaying it?SDL 1.3:如何在不显示的情况下渲染视频?
【发布时间】:2011-06-18 17:04:31
【问题描述】:

所以我需要的很简单:假设我们根本没有 gui - ssh 访问我们将构建和托管我们的应用程序的某个 linux。该应用程序将生成视频流。我们有一些带有 OpenGL 着色器的 SDL 应用程序。我们想要的只是将渲染(通常在 SDL 窗口中)作为 char*(大小为 W*H*3) 怎么做?如何让 SDL 不渲染到它的 gui 窗口,而是渲染成一些可交换的指针?

【问题讨论】:

    标签: c++ opengl rendering sdl shader


    【解决方案1】:

    为了有任何用途,OpenGL 应该是硬件加速的,所以首先检查您的服务器是否有满足您要求的 GPU。如果您使用的是租用的虚拟服务器或某些标准根服务器,那么您很可能没有 GPU。

    如果你有 GPU,那么有两种可能的方法:


    方法一——简单的方法

    您将(很遗憾)必须为其配置和启动 X 服务器并且此 X 服务器还必须是当前的虚拟终端(即它必须是显卡上的活动对象) .然后,您让将运行该视频生成器的用户访问该 X 显示器(阅读 man xauth 及其引用的内容)

    下一步独立于 SDL,它是一个 OpenGL 的想法:创建一个帧缓冲区对象,在其上渲染所需的图形; PBuffer 也可以工作,实际上在这种情况下我更喜欢它,但是我发现 Framebuffer Objects 在当前 Linux 及其驱动程序上比 PBuffers 更可靠。

    然后像往常一样渲染到这个 Framebuffer Object 或 PBuffer 并使用glReadPixels检索内容


    方法二——灵活的一种

    在底层,这与方法 1 非常相似,但为您抽象了一些东西:获取 VirtualGL http://www.virtualgl.org/ 以在 GPU 上执行实际的 OpenGL 渲染。您无需在辅助 X 服务器上启动应用程序,而是直接使用提供的 VirtualGL 服务器发送 GLX 流并返回 JPEG 图像流。您还可以使用运行虚拟帧缓冲区的辅助 X 服务器并对其进行连续截屏。或者可能是最优雅的:编写您自己的 X.Org 视频驱动程序,将视频直接传递到视频流媒体。


    【讨论】:

      【解决方案2】:

      您不能在 OpenGL 中直接渲染到字节数组。

      有两种方法可以解决这个问题。第一种方式最简单,不需要上下文噱头,而第二种方式则可以。

      首先,简单的方法。

      为了让 OpenGL 工作,你需要有一个窗口。这并不意味着窗口需要可见,但您需要创建一个以获得有效的 OpenGL 上下文。因此第 1 步:创建一个窗口并将其最小化。

      现在,为了获得有效渲染,帧缓冲区中的像素必须通过“像素所有权测试”。当渲染到保存屏幕本身的帧缓冲区时,在屏幕上实际上不可见的窗口像素无法通过像素所有权测试。因此,如果您使用 glReadPixels,这些像素的值是未定义的。

      但是,这仅适用于与窗口关联的默认帧缓冲区。帧缓冲区对象总是通过像素所有权测试。因此,第 2 步:根据您的需要创建一个帧缓冲区对象和关联的渲染缓冲区。

      从那里开始,这很简单。当您想要获取数据时,只需正常渲染并执行 glReadPixels 即可。 Pixel buffer objects 可用于异步传输像素数据,如果性能是一个问题。 第 3 步:渲染并使用 glReadPixels 获取数据。


      第二种方式更广泛可用(FBO 需要扩展支持或 OpenGL 3.0),但更特定于平台。

      不是在步骤 2 中创建 FBO,而是步骤 2:使用 glXCreatePbuffer 创建 pbuffer。 pbuffer 是一个屏幕外渲染目标,其作用类似于默认帧缓冲区。你 glXMakeContextCurrent 告诉 OpenGL 渲染到 pbuffer 而不是默认的帧缓冲区。

      步骤 1 和 3 同上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 2018-09-19
        • 2018-12-14
        相关资源
        最近更新 更多