1

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

现在什么工作:

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

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

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

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

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

4

1 回答 1

1

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

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

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

于 2016-06-17T15:12:48.523 回答