【问题标题】:Stream OpenGL framebuffer over HTTP (via FFmpeg)通过 HTTP 流式传输 OpenGL 帧缓冲区(通过 FFmpeg)
【发布时间】:2016-06-17 14:26:00
【问题描述】:

我有一个 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 帧缓冲区内容的流式传输有更好的想法,我很想知道。

【问题讨论】:

    标签: c++ opengl ffmpeg ffserver


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这听起来很有希望。我会测试一下。
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多