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



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

脑海中的几个问题:

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

  2. 如何使用C/C++以编程方式将这些PNG图像文件编码为连续(实时)视频(而无需手动将图像文件推送到流媒体服务器软件,如Flash Media live Encoder)?我应该制作什么格式的视频?

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

  4. HTML5视频标签是否支持实时视频流,或者它只适用于存在于特定URL/目录的完整视频文件(而不是实时流)?

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

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

要在网络浏览器中查看视频,您必须选择流媒体格式。Safari支持HTML5中的HLS,但不幸的是,其他方面并不支持。要获得广泛的客户端支持,您需要使用诸如flash或媒体播放器之类的插件。

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

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

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

基本上,您可以将一些COTS解决方案串成一个管道,并在标准播放器上播放,而无需自己处理套接字和低级别的东西。

相关内容

  • 没有找到相关文章

最新更新