NodeJS版本EasyDarwin开源流媒体服务器开发心得
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两个细节的地方:
m媒体描述下面有个属性名为control的属性, 它的值和后续SETUP请求的uri的尾巴是对应的, 椐此可以明确SETUP是音频还是视频.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的易用性.

获取更多信息
EasyDarwin开源流媒体服务器:www.EasyDarwin.org
EasyDSS商用流媒体解决方案:www.EasyDSS.com
EasyNVR无插件直播方案:www.EasyNVR.com
Copyright © EasyDarwin Team 2012-2019

NodeJS版本EasyDarwin开源流媒体服务器开发心得的更多相关文章
- EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布
EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...
- EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法
EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...
- EasyDarwin开源流媒体服务器将select改为epoll的方法
本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...
- 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题
最近在开发EasyDarwin开源流媒体服务器HLS直播的时候发现一个现象:在PC上用flash player播放HLS和在ios上面播放HLS时,效果明显不同,在ios上播放非常稳定,而在flash ...
- EasyDarwin开源流媒体服务器提供的TS切片/HLS直播打包库
EasyHLS Github:https://github.com/EasyDarwin/EasyHLS EasyHLS是什么? EasyHLS是EasyDarwin开源流媒体社区开发的一款HLS打 ...
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...
- 基于EasyDarwin开源流媒体服务器框架实现EasyNVR H5无插件直播流媒体服务器方案
背景分析 在之前的一篇博客<web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!>中,描述了实现一套H5无插件直播方案的各个组件的参考建议,又在博客<EasyNVR H5流媒体服 ...
- EasyPusher安卓直播推流到EasyDarwin开源流媒体服务器工程简析
EasyPusher主要有三部分组件组成:采集,编码,叠加,上传.在这个基础上同时支持本地存储\后台预览的功能.主要业务模块与相关类之间的关系如图所示: Created with Raphaël 2. ...
随机推荐
- Memcachedclientutils类
0.个人标签 我的CSDN博客地址: http://blog.csdn.net/caicongyang 1.依赖的jar包 commons-pool-1.5.6.jar slf4j-api-1.6.1 ...
- Python——@property属性描述符
@property 可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的 假设定义了一个类Cls,该类必须继承自object类,有一私 ...
- 8、Linux设备驱动的并发控制
一.并发与竞争 并发是指多个 多个执行单元同时执行,而这对对共享的资源,比如硬件的资源.软件的全局变量.静态变量 的访问,很容易导致竞态, 1.1.中断屏蔽 在单核的 CPU 里,避 ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(一)—— 手把手教你创建第一个三层架构+mvc的asp.net项目
下面开启项目 1. 打开vs2010-文件-新建项目 2. 先创建一个空的解决方案: 选择其他项目类型-visual studio 解决方案-空白解决方案(默认.NET Framework 4),项目 ...
- 最小生成树之Kruskal算法和Prim算法
依据图的深度优先遍历和广度优先遍历,能够用最少的边连接全部的顶点,并且不会形成回路. 这样的连接全部顶点并且路径唯一的树型结构称为生成树或扩展树.实际中.希望产生的生成树的全部边的权值和最小,称之为最 ...
- Audio简介
本片只简单从硬件角度简介Audio AC97/HDA Audio总线分两种: (1)I2S (2)HDA HD Audio spec Audio verb table是用来初始化audio的,一个au ...
- sqlite or svn 错误 The database disk image is malformed 可解决
在网上找了很多资料,很多网友都提到这个问题是不可解决的,面对这个问题,只能作罢. 但我不甘心这么丢失数据,最最后找到了一个解决方法.经测试,原来数据,全部保住. 以下为原文. http://www.s ...
- Linux Ctrl+z bg fg jobs命令使用
一.暂停前台运行时间长的程序 使用Ctrl + z然后可以看到系统提示: []+ Stopped /home/test/demo.sh 二.bg命令 将程序放到后台处理 bg %jobnumber ...
- Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持
Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1. 设置 document.domain为一致 推荐1 2. Apache 反向代理 推荐1 ...
- SQL : IN 和 Exists 的区别
Sql语句中IN和exists的区别及应用 表展示 首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 确定给定的值是否与子查询或列表中 ...