gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:26:13 25 4
gpt4 key购买 nike

我有一个 OpenGL 应用程序,其渲染图像需要通过互联网流式传输到移动客户端。以前,只需将渲染记录到视频文件中就可以了,这已经可以使用了,现在应该扩展到后续的流媒体。

现在的工作:

  • 将场景渲染到 OpenGL 帧缓冲区对象
  • 使用 NvIFR 捕获 FBO 内容
  • 使用 NvENC 将其编码为 H.264(无需 CPU 往返)
  • 将编码帧作为字节数组下载到主机内存
  • 将此帧附加到视频文件

到目前为止,这些步骤都不涉及 FFmpeg 或任何其他库。我现在想用“通过 Internet 流式传输当前帧的字节数组”替换最后一步,我认为使用 FFmpeg 和 FFserver 将是一个合理的选择。我对么?如果不是,正确的方法是什么?

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

上面提到的我已经能够创建的文件是一个 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

关于c++ - 通过 HTTP 流式传输 OpenGL 帧缓冲区(通过 FFmpeg),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37884084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com