title: Node版本EasyDarwin开发心得

date: 2018-03-27 22:46:15

tags:

年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月27日上线了第一个版本,今天小米发布了MIX2S, 致敬! 致敬!

关于RTSP协议

目前这个第一版暂时仅支持RTSP Over TCP, 不过RTSP Over UDP也会很快实现.总体来说, RTSP协议比较简单.开发过程中对RTSP协议的理解主要参考了 rtsp协议详解 这篇文章.sdp的解析一开始自己写的, 反复参考资料了解sdp各个字段的含义.后来偶然在npm上找到 sdp-transform 这个库, 处理sdp信息非常方便, 果断star了.

记录sdp两个细节的地方:

  1. m 媒体描述下面有个属性名为 control 的属性, 它的值和后续 SETUP 请求的 uri 的尾巴是对应的, 椐此可以明确 SETUP 是音频还是视频.

  2. SETUP 携带的请求头 Transport 中有个参数叫 interleaved, 这个东西常见的内容是一个偶数-一个奇数, 这两个数值代表RTP传输的通道标识.一个RTP包前面有4个节字的头: 1个字节的固定$(0x24)符;1个字节通道标识;2个字节的RTP包长度.对应的正是这个头里面的第2个字节.一般偶数表示数据通道, 奇数表示控制通道.

理解以上两点, 有助于在RTP传输过程中, 针对特定的视频格式, 缓存GOP,实现秒开效果.

NodeJS效率问题

从TCP流式数据中解析RTP包, 对NodeJS的处理效率是个考验.在初始阶段, 简单的利用 socket data 事件回调, 只要接收到数据, 就走一次协议解析. 实测发现一路播放的情况下都很卡顿. 最后是参考了 Node-Media-Server 中的 BufferPool 实现, 利用 Generator 和 yield. 只有当接收数据长度达到要求的时候, 才去做协议解析. 这样效率得到巨大提升, 播放不卡顿了. 中间还尝试过利用 socket pipe 将RTP包流转给播放端, 这样做确实效率很高, 也可以解决播放卡顿. 但是这种方式下, 解不到单个RTP包, 就无法做GOP缓存, 所以弃用了.

秒开实现

结合sdp中的媒体描述和 SETUP Transport interleaved 的值, 可以识别出一个RTP包携带的内容是媒体数据还是控制数据, 如果是媒体数据, 是音频还是视频, 如果是视频, 那么视频数据的编码格式是什么. 基于这些, 当收到携带h264数据的RTP包时, 做关键帧识别, 缓存GOP.

在RTP包中识别h264关键帧, 需要了解RTP包格式, h264 nalu type, fu-a 分包这些内容.这里我主要参考了CSDN上这篇博客 RTP协议全解析(H264码流和PS流)

总结

用Node实现EasyDarwin那样的RTSP流媒体转发, 最后的效果是令人满意的.目前的代码量很小.Node在处理字节流的过程中, 反复使用了自带的Buffer库函数. concat, slice, readXXXBE(以大端方式读网络字节序). 在这一版中, 我给它搭配了一个 HTTP Server, 提供了可视化的统计信息展示. 总之, Node.js 的引入将大大提高EasyDarwin开源流媒体服务的开发效率, 提升EasyDarwin的易用性.

NodeEasyDarwin Github

获取更多信息

邮件:support@easydarwin.org

EasyDarwin开源流媒体服务器:www.EasyDarwin.org

EasyDSS商用流媒体解决方案:www.EasyDSS.com

EasyNVR无插件直播方案:www.EasyNVR.com

Copyright © EasyDarwin Team 2012-2019

NodeJS版本EasyDarwin开源流媒体服务器开发心得的更多相关文章

  1. EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布

    EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...

  2. EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法

    EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...

  3. EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路

    背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...

  4. EasyDarwin开源流媒体服务器将select改为epoll的方法

    本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...

  5. 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题

    最近在开发EasyDarwin开源流媒体服务器HLS直播的时候发现一个现象:在PC上用flash player播放HLS和在ios上面播放HLS时,效果明显不同,在ios上播放非常稳定,而在flash ...

  6. EasyDarwin开源流媒体服务器提供的TS切片/HLS直播打包库

    EasyHLS  Github:https://github.com/EasyDarwin/EasyHLS EasyHLS是什么? EasyHLS是EasyDarwin开源流媒体社区开发的一款HLS打 ...

  7. EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...

  8. 基于EasyDarwin开源流媒体服务器框架实现EasyNVR H5无插件直播流媒体服务器方案

    背景分析 在之前的一篇博客<web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!>中,描述了实现一套H5无插件直播方案的各个组件的参考建议,又在博客<EasyNVR H5流媒体服 ...

  9. EasyPusher安卓直播推流到EasyDarwin开源流媒体服务器工程简析

    EasyPusher主要有三部分组件组成:采集,编码,叠加,上传.在这个基础上同时支持本地存储\后台预览的功能.主要业务模块与相关类之间的关系如图所示: Created with Raphaël 2. ...

随机推荐

  1. C# 0-1背包问题

    0-1背包问题 0-1背包问题基本思想: p[i,j]表示在前面i个物品总价值为j时的价值最大值.str[i, j]表示在前面i个物品总价值为j时的价值最大值时的物品重量串. i=0 或者j=0时: ...

  2. centos 6.5 python2.6.6 zbar 安装

       经过数次折腾,终于搞明白了这个zbar的安装顺序.   1.先安装http://zbar.sourceforge.net/download.html 下的zbar,   2.python 安装z ...

  3. Django——QuerySets酷毙了!

    Django的QuerySets酷毙了! 在本文中我将解释一下QuerySets是什么,它是如何工作的(如果你对它已经熟悉了,你可以直接跳到第二部分),我认为如果可以的话你应该总是返回QuerySet ...

  4. 每日一个机器学习算法——LR(逻辑回归)

    本系列文章用于汇集知识点,查漏补缺,面试找工作之用.数学公式较多,解释较少. 1.假设 2.sigmoid函数: 3.假设的含义: 4.性质: 5.找一个凸损失函数 6.可由最大似然估计推导出 单个样 ...

  5. MATLAB 的字符串分析

    MATLAB的字符串分析. 字符串实际上是指1Xn 的字符数组. MATLAB软件具有强大的字符串处理功能,提供了很多的字符或字符串处理函数,包括字符串的创建.字符串的属性.比较.查找以及字符串的转换 ...

  6. Hive 作业优化

    1.Join原则将条目少的表/子查询放在 Join的左边. 原因是在 Join 操作的 Reduce 阶段,位于 Join左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出的 ...

  7. Git实战(四)状态转换

    上次的Git实战(三)环境搭建博文.我们大致解说了一下git的环境安装,今天我们解说一下Git的状态转换. 学习版本号控制工具.对工具进行版本号控制之间的状态转换很重要.毕竟Git仅仅是一个工具.假设 ...

  8. 如何理解HTTP协议的“无连接,无状态”特点

    是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1.支持客户/服务器模式;2.简单快速;3.灵活;4.无连接;5.无状态. 无连接 无连接的含义是限制每次连接只处理一个请求.服务器处理 ...

  9. Python内置函数之filter()

    filter(function,iterable)用来过滤可迭代对象 如果提供过滤条件的函数为None,则可迭代对象中为False的元素将被过滤掉. 例如: >>> a = [,,F ...

  10. python3输出指定log信息

    问题背景: win10 python xxx.py > c:test.txt 上面这句只能把信息输出到test.txt,但是控制台看不到信息 ########################## ...