Websocket 编码和流式传输连续PNG输出图像文件,在Web浏览器上作为实时视频流

Websocket 编码和流式传输连续PNG输出图像文件,在Web浏览器上作为实时视频流,websocket,html5-video,video-encoding,http-live-streaming,live-streaming,Websocket,Html5 Video,Video Encoding,Http Live Streaming,Live Streaming,我有一个OpenGL应用程序,它渲染模拟动画,每秒输出几个PNG图像文件,并将这些文件保存在磁盘中。我想通过HTTP协议将这些图像文件作为视频流传输,这样我就可以从web浏览器查看动画视频。我已经有一个健壮的套接字服务器来处理来自websocket的连接,我可以处理所有握手和消息编码/解码部分。我的服务器程序和OpenGL应用程序都是用C++编写的。 我想问几个问题: 流式传输OpenGL动画输出并从web浏览器查看它的最佳方式是什么?视频图像帧由OpenGL应用程序动态(连续)生成为PNG图像

我有一个OpenGL应用程序,它渲染模拟动画,每秒输出几个PNG图像文件,并将这些文件保存在磁盘中。我想通过HTTP协议将这些图像文件作为视频流传输,这样我就可以从web浏览器查看动画视频。我已经有一个健壮的套接字服务器来处理来自websocket的连接,我可以处理所有握手和消息编码/解码部分。我的服务器程序和OpenGL应用程序都是用C++编写的。 我想问几个问题:

  • 流式传输OpenGL动画输出并从web浏览器查看它的最佳方式是什么?视频图像帧由OpenGL应用程序动态(连续)生成为PNG图像文件。web浏览器应显示与OpenGL显示输出相对应的视频(具有最小延迟时间)

  • 如何使用C++编程将这些PNG图像文件编码为连续(实况)视频(不需要我手动将图像文件推送到流媒体服务器软件,比如Flash媒体Live编码器)?我应该制作什么样的视频格式

  • 我应该使用web套接字发送/接收动画数据,还是有其他更好的方法?(就像jqueryajax调用一样,我只是在编故事,但请指导我如何正确实现它)。如果这种实时视频流能够在不同的浏览器上运行,那就太棒了

  • HTML5视频标签是否支持实时视频流,还是仅适用于存在于特定URL/目录(非实时流)的完整视频文件

  • 是否有任何现有的代码示例(教程)用于执行此实时视频流,其中您有一个C/C++/Java应用程序生成一些图像帧,并且有一个web浏览器将此输出作为视频流使用?在谷歌上搜索了几个小时后,我几乎找不到关于这个主题的教程


  • 大多数实时视频在内部是MPEG2,包装为RTMP(闪存)或HLS(苹果)。可能有一种方法可以将OpenGL渲染为帧,并将它们转换为MPEG2作为实时流,但我不知道具体如何实现(可能是FFMPEG?)。完成后,您可以通过Flash Media Live Encoder(免费)推送流,并使用RTMP将其直接流式传输到Flash客户端,或将其发布到Wowza Media Server中,以将其打包用于Flash、Http直播(Cupertino)、Silverlight的平滑流式传输


    基本上,您可以将一些COTS解决方案组合到一个管道中,在标准播放器上播放,而无需自己处理套接字和低级内容。

    您肯定希望停止将PNG文件输出到磁盘,而是将图像数据帧输入视频编码器。最好使用libav/ffmpeg。接下来,您必须将编码视频封装为网络友好格式。我建议将x264作为编码器和MPEG4或MPEG2TS流格式

    要在web浏览器中查看视频,您必须选择流媒体格式。HTML5中的HLS是由Safari支持的,但不幸的是,除此之外没有太多。要获得广泛的客户端支持,您需要使用诸如flash或媒体播放器之类的插件

    我能想到的最简单的方法是使用Wowza来进行服务器端的重新分组。GL程序将MPEG2 TS流式传输到Wowza,然后为HLS、RTMP(闪存)、RTSP和Microsoft平滑流式传输(Silverlight)准备流。Wowza的价格约为1000美元。您可以使用免费的Red5设置RTMP流。或者,您可以使用VLC进行RTSP服务,但RTSP客户端通常都很糟糕


    不幸的是,目前web视频的标准化水平很低,视频工具相当繁琐。这是一项巨大的任务,但您可以使用ffmpeg/libav进行黑客攻击。概念证明可以是将YUV420p格式的图像帧写入ffmpeg正在侦听的管道,并选择可以使用RTSP客户端(如VLC、Quicktime或Windows Media Player)读取的输出流。

    我已经可以从opengl程序生成PNG图像帧,这将是连续图像帧。使用Flash Media Live encoder意味着我必须通过Flash Media Live encoder软件手动推送图像帧,对吗?我的主要问题是,只要应用程序运行,opengl应用程序就会继续生成新的png图像文件,我需要将这些文件自动转换为视频流(无需我手动插入这些文件),并将其作为实时流显示在web浏览器上(直到我停止应用程序)。我可以通过编程实现吗?剩下的就是找到一个解决方案来批量生成帧->mpeg过程。以合适的帧速率将PNG写入磁盘是昂贵的,因此在内存中这样做是明智的。我有这方面的每一步的经验…但你可能会找到一个编码器,它可以做到这一点,将PNG作为输入,并将它们串入实时mpeg。你可能只需要找到一个mpeg库并编写一个服务就可以了。他们有一个Eclipse插件,开发很容易。对于HTTP实时流,您可以动态编写plylists和片段。这和HTTP Live Cupertino流媒体协议可能会为您指明正确的方向。互联网视频通常是MPEG4 AVC(h.264),而不是MPEG2。但您描述的基本工作流程可能是原始海报所需要的。我将此答案标记为已接受,因为此答案为给定问题提供了有效的解决方案。将帧直接输入视频编码器确实比将PNG文件输出到磁盘更有效。使用ffmpeg进行实时编码似乎并不容易,但我将尝试为ffmpeg编写程序来收听实时输入流。是否有可用的C++ FFM实例来编写FFM