# 诞生过程

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 渐进式开发思想非常棒,受此启发,将流媒体服务器的核心和外围功能分离,实现了插件化的框架设计。

Last Updated: 12/1/2020, 10:55:24 PM