用Go语言开发的新版NodeMediaServer

之前曾介绍过一款用Node.JS实现的开源RTMP流媒体服务端。目前更新到2.1.3版本,这是个从15年出开始接触Node.js作为研习而建立的项目。说起写完这个项目,对理解nodejs异步架构,rtmp网络协议还是起到了非常重要的作用。

rtmp协议如果用异步解析数据还是比较麻烦的,最早的版本写了个buffer缓冲,再用Generators/yield来转成同步逻辑,简单了许多。接触到async、await后又更新了个版本,代码可读性提高了不少。最后又学习了一个异步状态机的实现,比较满意。

nodejs的工作原理是单线程依靠事件驱动的异步非阻塞模型。利用Windows上的IOCP,Linux的epoll,Unix上的kqueue,在底层用c语言封装为libuv库,再套上v8引擎的js解析器。是很不错,可惜天生不能利用多核。于是写了个Cluster版本,原理和Nginx-Rtmp的 auto_push模式一样。但如果作为大量推流客户端的场景,会自动创建太多分发流,反而影响性能。

测试并发量时,发现只要直播流里面包含音频,性能下降非常明显,通过–inspect启动分析cpu占用,主要是在socket write中占用较多。原来是因为音频包小且多,频繁的系统调用耗费大量时间。阅读nodejs源码和文档,找到一个方法:使用socket的cork和uncork API,可以让系统缓存部分数据包的引用,再一次性调用writev来发送数据。性能提升非常明显!!

后来想做内置实时音视频转码器,用C++ Addon,NAN,N-API写了好几个版本,最终都放弃了。比如NAN编译后只能在固定的版本上运行。

以上,是Node.js实现中遇到的一些心得与困惑。这也使我决定更换平台了。Golang当然作为首选语言。这次是跟着这个视频学的,讲的非常好。《Google资深工程师深度讲解Go语言》

最新Golang版NMS发布的地址:https://github.com/NodeMedia/NodeMediaServer

新版本有什么特性

  • 超高性能,实测4核2G,500kbps流,轻松上万并发
  • 支持RTMP,HTTP-FLV,WebSocket-FLV,推流与播放。是的,可以用ffmpeg -re -i input -c copy -f flv http://server_ip:port/live/s.flv推流,也可以利用websocket-flv协议推流!
  • 利用CGO技术整合了以往成熟的实时音频转码技术,任何rtmp协议支持的非aac音频编码,都可以无延迟不开新流转码AAC输出。
  • 内置了RTMP/RTSP中继串流器,已经实现了主动从海康、大华NVR取实时和录像流转推RTMP。

更多实用功能正在持续开发中,欢迎试用。

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: 用Go语言开发的新版NodeMediaServer

3 评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据