通过 HTTP 流式传输 OpenGL 帧缓冲区(通过 FFmpeg)

Stream OpenGL framebuffer over HTTP (via FFmpeg)

我有一个 OpenGL 应用程序,其渲染图像需要通过 Internet 流式传输到移动客户端。以前只需要简单的把渲染记录成视频文件就可以了,现在已经可以了,现在应该扩展到后续推流

目前有效的是:

到目前为止,

None 个步骤涉及 FFmpeg 或任何其他库。我现在想用 "Stream the current frame's byte array over internet" 替换最后一步,我认为使用 FFmpeg 和 FFserver 是一个合理的选择。我对么?如果不是,正确的方法是什么?

如果是这样,我如何在我的 C++ 代码中处理它?正如所指出的,帧已经被编码。此外,没有声音或其他东西,只是一个 H.264 编码帧作为字节数组,不定期更新,应该转换为稳定的视频流。我假设这将是 FFmpeg 的工作,并且随后通过 FFserver 进行流式传输将从那里变得简单。我不知道的是如何首先将我的数据提供给 FFmpeg,因为我找到的所有 FFmpeg 教程(在非详尽搜索中)都在文件或 webcam/capture 设备上工作作为数据源,而不是易失性主存中的数据。

上面提到的我已经能够创建的文件是一个 C++ 文件流,我将每个帧附加到该文件流,这意味着视频和渲染的不同帧率没有得到正确处理。这也需要在某些时候处理。

有人能指出我正确的方向吗?我可以将数据从我的应用程序转发到 FFmpeg 以构建适当的视频源而不写入硬盘吗?非常感谢教程。顺便说一句 FFmpeg/FFserver 不是强制性的。如果您对流式传输 OpenGL 帧缓冲区内容有更好的想法,我很想知道。

您可以向 ffmpeg 进程提供易于编码的 H.264 数据 (-f h264),并告诉它只需将流复制到输出多路复用器 (-c:v copy)。要将数据实际导入 ffmpeg,只需将其作为子进程启动,并使用连接到其 stdin 的管道并将 stdin 指定为读取源

FILE *ffmpeg_in = popen("ffmpeg -i /dev/stdin -f h264 -c copy ...", "w");

然后您可以将编码的 h264 流写入 ffmpeg_in