Skip to content

诞生过程

Monibuca 的诞生可以追溯到 2006 年……

编写Flash视频会议系统

本人最早的工作是开发 Flash 视频会议系统,当时使用的是 FCS (全称 Flash Communication Server )作为流媒体服务器,后来改名为 FMS (全称 Flash Media Server )。当时很多业务逻辑是可以直接编写成脚本来运行的。FMS 是性能十分优越的服务器,具有集群功能,唯一的不足是比较昂贵。所以当时诞生了开源的 java 编写的 Red5Red5 最大的缺点就是性能较差。在阅读 Red5 源码的过程中,便一窥 RTMP 协议的全部。

移植crtmpserver

当时公司不允许使用 FMS 作为服务器(无经费),然后就发现了这款开源的 rtmp 服务器,当时使用的时候发现性能很不错。就尝试在上面进行扩展,实现了一些 FMS 的功能,比如 sharedobject 等。

H5播放器诞生

其实一切的起因都来自这款播放器,虽然我至今尚为开源,但一直是我研究和开发流媒体服务器的原动力。最早是发现了一个开源项目 https://github.com/mbebenita/Broadway,这个项目是将 H264 的解码程序通过 emscripten 编译成了 js ,在浏览器端解码播放 H264 视频。然后我就在这个基础上实现了 rtmp 协议的 js 编译,然后通过 websocket 传输。后来想到,没有必要去实现 rtmp ,可以在 websocket 中传输裸数据即可,这样可以节省带宽,也可以减轻浏览器端的解码压力。随后开始陆续将音频解码程序集成进播放器中,最后将 h265 的解码程序也集成进去了。有两款 h265 的解码程序,分别是 lib265libhevc 。现已开源https://github.com/langhuihui/jessibuca

照猫画虎的csharprtmp

当时为了更好的进行扩展,也是基于对 C# 的狂热,我移植了 crtmpserver 的大部分功能到了 C# https://github.com/langhuihui/csharprtmp。在这个过程中,对多线程、 RTMP 协议、 AMF 协议有了深刻的认识。当然由于功力尚浅,该 server 不是很稳定。

扩展MonaServer

当时为了能节省带宽,就开始研究 RTMFP 协议。于是发现了 OpenRTMFP ,又名 Cumulus Server 。很快这个项目变成了 MonaServer ,用了更为现代的 C++ 编程,比 crtmpserver 更容易二次开发。于是我选择这款服务器进行了二次开发,又再次实现了一些 FMS 的功能,然后通过 WebSocket 传输音视频裸数据到 H5 播放器上面。但是一直有内存泄漏困扰着我,一直没有解决,所以也无法商用。

遇见srs

偶然机会发现了这款功能很强的服务器,可以通过一个 go 程序将 srshttp-flv 转换成 websocket 中传输 flv 的方式对接我的 h5 播放器,于是这个组合运用到了商用场景中。但是经过一次转发总觉得不是很满意,想改造 srs ,但是 srs 代码读起来很费劲,这不是黑 srs ,应该是本人 C++ 功力还太浅吧。

Node-Media-Server vs Gortmp

随着 flash 的陨落,本人转型 Node.js ,就发现了用 Node 写成的流媒体服务器 Node-Media-Server ,当时这个还在早期开发阶段,我和作者聊了不少,也 fork 了项目,想要在上面进行二次开发,不过当时 go 语言兴起,有许多 go 写的流媒体服务器诞生,我作了对比后发现还是 golang 的运行性能高,于是放弃了使用 Node.js 开发的念头。在对比了多款 golang 的项目后,最终选定 gortmp 作为二次开发的基础。

受到vue渐进式思想的影响

gortmp 基础上快速的二次开发成为良好的体验,给了我一个启示,在经历了那么多次的二次开发,流媒体服务器的二次开发是一件非常艰难的事情,而 golang 打开了一扇新的大门,但不能满足修修补补,需要一款任何人都能快速进行定制化的开发框架。vue 渐进式开发思想非常棒,受此启发,将流媒体服务器的核心和外围功能分离,实现了插件化的框架设计。