第一次尝试用Node.js实现RTMP服务器是在15年初的时候,那时候刚完成Android/iOS平台上rtmp播放发布SDK:NodeMediaClient的雏形.
那时候有个参考项目https://github.com/iizukanao/node-rtsp-rtmp-server,当时的完成度算是比较高的了(Node.js实现) ,不过作者很牛,是用coffee-script实现的,基本看不懂,转译后的js代码也比较难读.
另外这个项目最大的问题是RTMP协议包解析,性能非常低.如果你单推一个1080的视频,cpu直接起飞,还不说播放.
这倒不怪作者,Node.js这种异步回调的模式,处理RTMP这种复杂数据包非常不利.
而我使用的解决方法是用到ES6的Generators+stream,封装为一个bufferpool.
socket异步回调数据的时候,往bufferpool里填数据,解析线程(这里也可能应该叫协程)先尝试询问是否有足够的数据,不够就yield,将CPU让给其他处理,当异步回调继续push数据时,如果达到上次需求的数据量,cpu就跳到刚刚yield的协程处继续往下解析.
仍然是单线程事件驱动,但数据解析是同步的逻辑.

发送逻辑暂时是用emit事件去通知socket发送data,可能比直接发送要多费些cpu,后面的版本继续优化.

也不限制音频编码了,以前的版本只支持H.264/AAC这种组合,现在speex,nellymoser也支持.

直播中首屏启动速度也是非常重要的,以前都叫秒开,现在得叫毫秒开.其实很关键的技术就是除了第一帧的sps/pps,紧接着就得来一个视频关键帧.
播放时当然不是每次都遇到第一个视频关键帧,所以得把推流端最近的关键帧缓存起来,播放时先把缓存的关键帧推下去.
就是GOPchache啦,nginx-rtmp还没有这个功能,体验还比不上SRS.
Node-Media-Server当然也支持啦,缓存最近的一个GOP.而且在Nodejs中实现也是非常非常简单的,这里就不多讲了,看代码吧.
当然就有人说有GOP缓存,延迟就大了,这是对的.不过自己实现播放端的话,还是很容易通过播放队列的长度来进行快进播放或丢弃处理,这样首屏毫秒开,延迟也可以自由控制.NodeMediaClient里,NodePlayer播放类就有两个参数,bufferTime和maxBufferTime.既保证首屏好秒开,又保证视频延迟低.

另外这次重写也新学了ES6的一些新特性和规范,代码写起来也比较规范吧.

后面可能还会继续实现其他的一些功能像是http-flv,hls,录制,转推,多进程这些硬性要求
也可能会实现Server Application,RTMPE,WebSocket,ffmpeg转码等
也或者支持接入WebRTC流,RTMFP等

项目地址:https://github.com/illuspas/Node-Media-Server
国内镜像:https://gitee.com/illuspas/Node-Media-Server

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

本文链接地址: 重写了Node.js版的Node-Media-Server

之前在RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置这篇中介绍了Nginx-Rtmp服务器通过on_play和on_publish事件回调到http服务上,再用ngx_http_secure_link_module进行鉴权.

今天介绍一种原生的方式

注:只在博主编译的Nginx-Rtmp-Win32版本中有此功能
下载https://github.com/illuspas/nginx-rtmp-win32/archive/master.zip版本

首先配置nginx.conf

继续阅读

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

本文链接地址: RTMP流媒体服务端应用开发系列 – Nginx-Rtmp-Win32仿星域CDN鉴权配置

srs-win32编译版 simple rtmp server是Linux环境下运营级流媒体服务器SRS的windows编译版,目的是方便windows平台开发者快速部署流媒体服务器开发测试环境.
同经典的Nginx-Rtmp-Win32项目一样,SRS-win32编译版提供了基本的RTMP\HLS服务.另外,还提供了目前直播app中非常流行的HTTP-FLV格式.
同样,该项目不建议做运营使用,项目是在cygwin环境下编译,默认最大打开文件数256,尽管可以在cygwin环境下修改ulimit数(2016.9.22:最新版2.0.217已默认设置最大打开文件数1024,注意:后来经过验证,即使是改了这地方,程序仍然不能开上百个连接), 但是由于没有Linux环境的epoll,无法高并发.但作为开发测试用已经足够了.
非常建议之前使用Nginx-Rtmp-Win32的开发者使用此项目.

都散了吧,博主精力有限,不会再出新版本了.
如果希望使用Windows平台开发,可以试试博主用Node.js实现的服务端:Node-Media-Server  真正跨平台,高性能谈不上,但上千路没有一点问题.流媒体服务不像HTTP,连接数还没上去,带宽已经跑满了,别太在意并发数.支持RTMP输入,RTMP/HTTP-FLV/WEBSOCKET-FLV输出,支持GOP_CACHE,推流鉴权,播放防盗链.

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

本文链接地址: SRS-win32 版更新,支持HTTP-FLV

HikToFms 是一款运行在windows服务器,从海康DVR或IPC取流并转码发布到Flash Media Server的程序.

同时,也支持绝大部分商用或开源RTMP流媒体服务器,如WOWZA,Evostream,Nginx-rtmp,srs等.

本程序对视频流进行了二次编码,在画质不变的情况下,码流可以减小一半以上.

同时优化了X86架构下的性能,实测xeon 8核,10路4CIF@12fps 编码占用CPU 10%~15%.

RTMP协议已被广泛应用于web客户端(只需flash插件),iOS,Android手机客户端,协议更标准,连接速度快,实时性好.

可应用但不限于以下场景.

幼儿园监控,为家长提供手机远程视频,观看宝宝动态,老师有没有打骂小朋友等.

社区监控,可为业主提供手机试试查看小区状况,停车位情况,

道路环境监控:在主要路段铺设摄像头,为车主实时查看路况提供信息,如天翼看交通应用.

厂房监控:厂房生产情况,老板实时远程查看,出差休息也能了解动态.

下载试用版:http://www.nodemedia.cn/zh/server/hiktofms/

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

本文链接地址: HikToFms v0.1

NodeMedia Dev Server是基于nginx-rtmp-module编译的windows版RTMP服务端完整实例。无需配置,一键运行,是您快速开发,测试,验证RTMP流的好帮手。
可以用来开发:视频直播间,音视频聊天,游戏直播,远程视频监控等。
包含以下实用工具:

  1. RTMP流媒体服务端
  2. Flash Rtmp流播放器
  3. Flash HLS直播流播放器
  4. Flash Rtmp摄像头视频发布器
  5. Flash 视频聊天Demo
  6. 批处理版的视频流循环发布器。

前往下载:http://www.nodemedia.cn/zh/nodemedia-dev-server

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

本文链接地址: NodeMedia Dev Server

实时的摄像头采集,实时编码,实时发布到流媒体服务器,进行视频直播。视频采用H.264,音频采用AAC,可根据需求发布480×360,320×240,240×180分辨率的视频。可控帧率,码率。320×240分辨率@10fps 中等质量,码率为160kbps左右,非恒定。cpu占用30%左右。
客户端使用Flash播放,跨平台兼容性好。
也可配合使用Android iOS SDK开发手机客户端。

  • 音频编码器:AAC,nellymoser,speex
  • 视频解码器: H.264
  • 协议:RTMP,RTMPT
  • ARMV7-A Neon加速
  • 极速精简内核,so库仅2.0M

前往下载:http://www.nodemedia.cn/zh/client/NodeMediaClient-Android/

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

本文链接地址: Android RTMP Live Encoder SDK

RTMP协议的实时视频播放客户端开发库,jni开发,java接口,可配合Adobe Flash Media Live Encoder 3.2或Android iOS直播发布端SDK进行实时视频直播。

  • 音频解码器:AAC,mp3,nellymoser,speex
  • 视频解码器: H.264,flv
  • 协议:RTMP,RTMPT
  • ARMV7-A Neon加速
  • 极速精简内核,so库仅1.4M

前往下载:http://www.nodemedia.cn/zh/client/NodeMediaClient-Android/

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

本文链接地址: Android RTMP Live Player SDK

其实是2个,一个基于fibjs,一个基于nodejs
两个版本大部分是一样的,只是在数据处理方面有差异。

fibjs版本:https://github.com/illuspas/NodeMediaServer
fibjs没有回调一说,同步的流程写起来相当舒服。

nodejs版:https://github.com/illuspas/Node-Media-Server
nodejs的数据是on(‘data’)回调回来的,解析rtmp包很费劲,需要根据包头一步一步分析出需要的包大小。为此写了个QueueBuffer类,请求的数据大小足够即返回,不够就回压再等待数据下次继续解析。

目前只支持了H264+AAC,支持多路发布和播放。
fibjs版目前在大并发的时候会阻塞发布端,写得有点问题,空了再改改。
没有缓冲关键帧,播放的启动时间可能会等下一个关键帧来了才开始

此项目仅为空闲时写着玩的,参照了很多别人的代码,并不会长期维护。如果你感兴趣,欢迎fork。

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

本文链接地址: 开源一个基于js的RTMP服务端

在使用flash cs/builder开发rtmp视频应用时,我们时常会在nc.connect的时候再传递一个对象作为连接信息发送给服务端。用于验证,确认连接用户,获取用户信息等等操作。
当我们使用ffmpeg来开发android,ios,pc版的rtmp应用时,已经为我们提供了非常方便的传参来实现。
先来看源代码:定位到libavformat/rtmpproto.c文件继续阅读

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

本文链接地址: 使用FFmpeg连接rtmp时发送自定义AMF DATA