最近实现了NMSv3接收GB28181设备注册,下发指令主动通知摄像头以RTP推流到NMS,转为RTMP, KMP, FLV播放。

NMSv3不是完整的GB28181实现,我将SIP信令与RTP流媒体服务器合二为一,仅作为实时视频取流的用途。

当我准备实现设备注册,密码验证时,找到一篇博文:https://blog.csdn.net/hiccupzhu/article/details/39696981

其中讲到的算法是:

HA1=MD5(username:realm:passwd) #username和realm在字段“Authorization”中可以找到,passwd这个是由客户端和服务器协商得到的,一般情况下UAC端存一个UAS也知道的密码就行了
HA2=MD5(Method:Uri) #Method一般有INVITE, ACK, OPTIONS, BYE, CANCEL, REGISTER;Uri可以在字段“Authorization”找到
response = MD5(HA1:nonce:HA2)

对比REGISTER中的response与计算的response,相同则验证通过。

但我却验证错误,仔细阅读了exosip这部分的代码后,终于找出差异:https://github.com/aurelihein/exosip/blob/master/src/jauth.c#L144

当设备第一次发送REGISTER,NMS回复401, 并附带

还有一种回复是

原来这个qop的设置与否,决定了验证算法的差异。

当不设置qop时,确实是使用上面的那种算法进行验证。而设置为”auth”后,则使用下面的这个算法:

HA1=MD5(username:realm:passwd) #username和realm在字段“Authorization”中可以找到,passwd这个是由客户端和服务器协商得到的,一般情况下UAC端存一个UAS也知道的密码就行了
HA2=MD5(Method:Uri) #Method一般有INVITE, ACK, OPTIONS, BYE, CANCEL, REGISTER;Uri可以在字段“Authorization”找到
response = MD5(HA1:nonce:nc:cnonce:qop:HA2)

可以看出,HA1、HA2是相同的,区别在于resopnse有差别。开发时需要注意这点,如果想使用简单的验证算法,回复401时,不要传qop=”auth”参数。

另外还有一种qop=”auth-int”的算法,这里由于决定权在服务端,所以不做详细研究。如果做向上级级联,则要根据上级401的参数来响应。

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

本文链接地址: GB28181 设备注册密码验证算法

华为云服务“通用计算增强型KC1”已正式商用,今天准备测试一下NMSv3的兼容运行情况。如果还没有华为云账户的话,先注册一个

搭载自研华为鲲鹏920处理器及25GE智能高速网卡,提供强劲鲲鹏算力和高性能网络,更好满足政府、互联网等各类企业对云上业务高性价比、安全可靠等诉求。

鲲鹏920是目前业界最高性能ARM-based处理器。该处理器采用7nm制造工艺,基于ARM架构授权,由华为公司自主设计完成。鲲鹏920主频可达2.6GHz,单芯片可支持64核。该芯片集成8通道DDR4,内存带宽超出业界主流46%。芯片集成100G RoCE以太网卡功能,大幅提高系统集成度。鲲鹏920支持PCIe4.0及CCIX接口,可提供640Gbps总带宽,单槽位接口速率为业界主流速率的两倍,有效提升存储及各类加速器的性能。典型主频下,SPECint Benchmark评分超过930,超出业界标杆25%。同时,能效比优于业界标杆30%。鲲鹏920以更低功耗为数据中心提供更强性能。

那我先来开一个最便宜的配置:

kc1.small.11vCPUs | 1GBHuawei Kunpeng 920 2.6GHz0.5/2 Gbit/s200,000¥59.25/月

好了,基本情况就是这样,来下载最新版NMSv3,可以看到北京四机房访问github的速度还不错,6M的程序4秒就完成了。

NMSv3 最新发布地址已更改,使用新的地址和版本。

没有任何问题,运行成功。GO语言开发跨平台软件的优势确实强大,不过由于NMSv3中使用了CGO技术,否则可以生成更多的目标平台。我将会在下阶段移植下龙芯处理器mips64el架构。

打开nms的web后台,一切正常。

推流并在本机播放1000个rtmp测试。

这是一个500kbps变码率的视频,1000个并发内部带宽达到600M左右,cpu占用20%~40%。由于1000个并发测试程序是在本机运行,所以也会占用一定的cpu。

由此可见,华为鲲鹏云KC1实例,即使是最低配置1核1G也是完全能够满足性能需求,因为流媒体应用最大的瓶颈是网络带宽。如果您需要使用到自主服务的话,华为鲲鹏云也是不错的选择。

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

本文链接地址: 测试华为鲲鹏云KC1实例运行NMSv3

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

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

继续阅读

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

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

第一次尝试用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

首先,为什么需要转码?
目前,Flash作为跨平台,跨浏览器的多媒体插件,在基于浏览器的视频直播发布应用上,仍然是不可替代的.
但它输出RTMP直播流时有个致命问题,只支持Speex或NellyMoser,不支持AAC音频编码.
即使是Flash Media Live Encoder这种应用程序仍然需要购买付费差价才能支持,不知道Adobe是处于什么考虑.
支持AAC有什么好处? 那太多了.
1.转出的HLS流可以直接被iOS/Android播放,可以使用HTML5技术在绝大多数浏览器内进行播放.
2.转出的HTTP-FLV流也可以依靠flv.js在绝大多数浏览器内进行播放,并且实时性非常好.
3.保存的录像文件可以被绝大多数播放器直接播放,speex/nellymoser很可能就无声了.

Nginx-Rtmp-Win32程序怎么实时转码?继续阅读

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

本文链接地址: RTMP流媒体服务端应用开发系列 – Nginx-Rtmp-Win32实时转码

之前在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

鉴权验证在自建直播流媒体服务端应用中是非常重要的。用以防止非法推流,控制收费播放盗链等场景。
目前各大直播云平台都支持url参数形式的鉴权验证法,例如rtmp://serverhost/app-name/stream-name?key=md5(secret+expires_timestemp)&time=expires_timestemp 这种既有私密key,又有时间戳过期判断的最简单形式,当然还能根据使用场景增加其他判断条件。
Nginx-Rtmp模块作为rtmp直播流媒体服务端,本身没有这种鉴权验证法,但能通过Notify 转为本地的http请求,使用Nginx内置的ngx_http_secure_link_module即能达到同样效果。

首先利用Nginx-Rtmp的on_play通知,将rtmp的播放事件通知到本地的http处理上来继续阅读

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

本文链接地址: RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置

开一个RTMP 流媒体服务端开发系列的坑,主要用到Rtmp-Nginx, Linux平台。

需求:推流端发布后,播放端只希望拉取播放纯音频或视频流。

分析:这种需求可能是为了效仿映客直播分离音视频流来播放的方法。从抓包来看,映客使用http-flv的CDN加速直播流,形如
http://pull.a8.com/live/1458696839457751.flv?only-video=1
http://pull.a8.com/live/1458696839457751.flv?only-audio=1
有什么好处? 不确定,估计播放端网络卡时,可以断开视频流但保持码率不大的音频流,体验较好。 还有一种可能是方便做纯音频类应用,播放端只想听到音频,虽然可以不解码视频,但是视频的数据也不想拉下来,节省移动数据流量。

思路:使用Nginx-Rtmp的exec来调用ffmpeg,在服务端分离rtmp流。

实现:继续阅读

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

本文链接地址: RTMP流媒体服务端应用开发系列 – Nginx-Rtmp分离音视频流