# EasyDSS-Kernel
**Repository Path**: Seven_EasyDrawin/EasyDSS-Kernel
## Basic Information
- **Project Name**: EasyDSS-Kernel
- **Description**: Streaming media middleware,EasyDSS Kernel内核,是EasyDSS流媒体服务的主要核心,支持协议包括RTSP、RTMP、HLS、HTTP-FLV,Easy系列的流媒体服务核心,以稳定、高效、功能丰富、Based on nginx为指标,经过多年的技术积累,现在以技术中台的方式对内、对外一致开放输出;
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 3
- **Created**: 2020-01-07
- **Last Updated**: 2025-06-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# EasyDSS-Kernel
EasyDSS-Kernel是一款高性能流媒体音视频服务软件,是整个Easy系列商业产品的流媒体核心服务,EasyDSS-Kernel是[EasyDarwin开源团队](http://www.easydarwin.org "EasyDarwin开源流媒体服务器")和[TSINGSEE青犀团队](http://www.tsingsee.com "TSINGSEE青犀云视频")经过多年的商业发展和迭代磨砺,集各种大成于一体的商业流媒体服务软件,采用业界优秀的nginx服务框架模式设计,充分秉承了高性能、高并发、高可用、易扩展的设计理念,目前基于EasyDSS-Kernel的多款商业软件([EasyDSS流媒体服务器](http://www.easydss.com "EasyDSS流媒体服务器")、[EasyNVR智能云终端](http://www.easynvr.com/ "EasyNVR智能云终端")、[EasyGBS国标流媒体服务](http://www.easygbs.com "EasyGBS国标流媒体服务")、[EasyNVS视频综合管理平台](http://www.easynvs.com/ "EasyNVS视频综合管理平台"))已经在旅游业、教育业、物流仓储、平安工地、能源环保、广电行业、工业与物联网、智能农业、视频智能分析等几乎所有的行业都已服务并稳定运营多年。EasyDSS移动互联网时代贴近企业点播/直播需求的一款接地气的流媒体服务器,可以形成一套完整的视频直播、录播解决方案,满足用户在各种行业场景的流媒体业务需求。
EasyDSS-Kernel是一套完全可靠的音视频流媒体服务,可基于EasyDSS-Kernel开发各种各样的流媒体应用!
## 服务参数
EasyDSS-Kernel在技术上非常好地融合了nginx、nginx-rtmp、flv、live555、ffmpeg等多项流媒体技术之大成:
### 主要性能参数包括
- [x] 支持多CPU多核心,能够充分挖掘硬件性能;
- [x] 7x24 全天候稳定运行;
- [x] 10Gb网卡,RTMP稳定输出8Gb/s+,HLS稳定输出9Gb/s+,稳定并发5K+连接;
- [x] 支持视频秒开;
- [x] 支持master/worker,自动请求master;
- [x] 支持负载均衡/集群;
- [x] 支持CDN部署(最大2W节点小型CDN),部署简单;
- [x] 支持3台控制服务器热备,任意两台出问题不影响服务;
- [x] 支持Flash RTMP直播推送;
- [x] 支持RTMP信号源自由切换,播放不间断;
- [x] 录制回放支持多盘高速读写,硬盘写入与网卡完美匹配,支持分布式存储,可定制各种存储接口;
- [x] 单台服务器支持域名隔离;
### 主要技术参数包括
- [x] 接收RTMP推流:接收RTMP推流客户端推送的RTMP音视频流,并转发给播放客户端;
- [x] 分发RTMP流:提供RTMP流的高性能分发,RTMP播放客户端可直接连接EasyDSS进行播放;
- [x] 分发HLS流:提供同步输出HLS流的功能,可以将推送的RTMP流进行实时HLS切片,并提供HLS流的高性能分发;
- [x] 直播录像:支持将推送的直播流进行同步录像保存;
- [x] 直播录像检索:支持检索系统的直播录像,提供录像检索和列表接口;
- [x] 直播录像回放点播:可以点播录制的服务端录像,提供HLS点播,自由seek与倍数播放功能;
- [x] 录像下载:可以对检索到的录像段进行下载,另存为MP4文件;
- [x] HTTP服务器:高性能的HTTP服务支持,用于提供HTTP访问,同时用于HLS流分发(具备nginx所有属性功能);
- [x] 防盗链:支持HTTP防盗链技术;
- [x] 主动拉取RTMP流进行转发:支持对RTMP流的主动拉取,并将此RTMP流进行RTMP/HLS的转发;
- [x] 转发RTMP流推送:支持将推送客户端推送的RTMP流,转发推送到其他RTMP流媒体服务器;
- [x] 推流鉴权验证:支持对推送客户端的推送流进行推流验证,若无权限的推流地址,则不接收客户端推流;
- [x] 推流信息统计:可以对推送流进行信息统计,包括推送时长、观看人数、起始时间、持续时长、视频码率、音频码率、推送流量等信息;
- [x] 播放鉴权:支持播放客户端播放验证,无权限的播放地址将无法进行播放;
- [x] 播放信息统计:对播放客户端的数量进行统计,并且可以统计客户端的开始时间、播放时长、播放流量等信息;
- [x] 跨平台:平台部署运行,Windows、Linux等;
- [x] 二次开发:提供HTTP二次开发接口,可使用接口进行一定的二次开发;
- [x] 支持lua扩展:支持自定义lua脚本扩展服务功能与接口功能;
- [x] 支持H.265:支持H.265视频编码格式的输入与输出;
- [x] 支持RTSP:支持同步输出RTSP协议流媒体;
- [x] 支持推送成功通知
- [x] 支持推送关闭通知
- [x] 支持播放前鉴权
- [x] 支持播放关闭后通知
- [x] 支持关键帧缓冲,支持直播秒开功能;
### 关于并发
程序并发没有任何限制,但是实际并发数取决于网卡的速率和CPU的性能以及视频码率。期待大家拿更性能更强的机器测试,性能强劲的机器需要优化easydss.conf发挥多CPU性能
### 支持的协议
1)输入协议:RTMP;
2)输出协议:RTMP、RTSP、HLS、HTTP-FLV;
### 目录结构
- release
发布目录
- web_src
前端网页代码目录
## 使用方法
### 如何运行
- windows
cd easydss && 以管理员权限运行 `install service.bat`
- linux
cd easydss && sh start.sh
## 如何配置
配置文件路径:conf/easydss.conf,注意:**无论是Windows还是Linux运行EasyDSS流媒体服务器,都不支持中文路径,请大家使用全英文路径**;
### 基础功能配置
http{ easydss_host 127.0.0.1; //本机对外服务IP,默认127.0.0.1
http{ init_by_lua server:set("RECORD_PATH", "www/hls") //录像检索的路径
http{ server{ listen 10088, //HTTP服务端口
http{ server{ location{ root www, //HTTP Web目录
rtmp{ server{ listen 10085, //RTMP 服务端口
rtmp{ server{ application{ hls_path www/hls //HLS直播切片目录
### 高级功能配置
1、rtmp功能配置
rtmp {
server {
listen $RTMP_PORT; #rtmp 监听端口,默认10085
#application可以自定义多个,例如:live/hls/record
application live { #rtmp 直播应用
live on;
}
application hls { #hls 直播应用
live on; #live 表示只分发 rtmp
hls on; #hls 同步输出 rtmp 和 hls 直播
hls_path $HLS_PATH; #hls切片目录
hls_fragment 4s; #ts 切片时长
}
application record { #record 直播应用
live on; #live 表示只分发 rtmp
hls on; #hls 同步输出 rtmp 和 hls 直播
hls_record on; #不配置或者配置 off 表示不录像,on 表示服务器端同步录像
hls_path $RECORD_PATH; #hls录像目录
hls_fragment 4s; #ts 切片时长
}
}
}
2、rtmp拉流配置
rtmp {
server {
#rtmp 监听端口,默认 10085
listen 10085;
#自动拉流配置
application pulltest {
live on;
#rtmp 地址为拉流地址,name 指定 rtmp 的 name
pull rtmp://ip:port/app/stream1 name=stream1;
pull rtmp://ip:port/app/stream2 name=stream2;
pull rtmp://ip:port/app/stream3 name=stream3;
}
}
}
例如配置为
`pull rtmp://www.easydass.com:10085/live/livetest name=livetest`,
则本地EasyDSS的转发地址为
`rtmp://ip:port/pulltest/livetest`
3、rtmp推流配置
EasyDSS提供rtmp推流转推功能
rtmp {
server {
listen 10085; #rtmp监听端口,默认10085
#自动推流配置
application pushtest {
live on;
#rtmp地址为推流地址,name指定rtmp的name
#当EasyDSS接收app为pushtest,name为stream1的rtmp流时
#可以同步转发到指定的rtmp推流地址
push rtmp://ip:port/app/stream1 name=stream1;
#当EasyDSS接收app为pushtest的推流时
#可以同步转发到指定的rtmp推流地址
#rtmp流的name将自动添加到转发地址进行转发
#如:接收推流为/pushtest/stream
#则会转发到rtmp://ip:port/app/stream
push rtmp://ip:port/app;
}
}
}
4、防盗链功能配置
http {
...
server {
listen $HTTP_PORT;
location / {
root $HTTP_ROOT_PATH;
#Anti-stealing-link
valid_referers none blocked localhost 127.0.0.1 ~\.baidu\. ~\.google\. addyourdomain;
if ($invalid_referer) {
return 403;
}
}
...
addyourdomain 此处替换成您自己的域名如:
`www.easydss.com`
多个用空格分开,如:
`www.easydss.com *.easydss.com`
通过以上配置,当在其他网站下试图打开您域名下的视频时, 将会得到 `access denied` 信息表示防盗链配置成功.
5、接收推流处理-on_publish
rtmp {
...
application live {
live on;
...
on_publish http://ip:port/xxxxx;
}
...
}
参数说明:
- method: POST
- MIME: application/x-www-form-urlencoded
- args: app - RTMP的application名称
name - 当前推流的流名称
- response: HTTP code返回200允许推流,其他为不允许
6、接收推流处理结束-on_publish_done
rtmp {
...
application live {
live on;
...
on_publish_done http://ip:port/xxxxx;
}
...
}
参数说明:
- method: POST
- MIME: application/x-www-form-urlencoded
- args: app - RTMP的application名称
name - 当前推流的流名称
begintime - 推流开始时间,从1970年1月1日的秒数
duration - 推流持续时间,单位为秒
inbytes - 推流总流量,单位为bytes
outbytes - 客户端播放总流量,单位为bytes
7、客户端开始播放处理-on_play
rtmp {
...
application live {
live on;
...
on_play http://ip:port/xxxxx;
}
...
}
参数说明:
- method: POST
- MIME: application/x-www-form-urlencoded
- args: app - RTMP的application名称
name - 当前推流的流名称
addr - 客户端地址
- response: HTTP code返回200允许推流,其他为不允许
8、客户端停止播放处理-on_play_done
rtmp {
...
application live {
live on;
...
on_play_done http://ip:port/xxxxx;
}
...
}
参数说明:
- method: POST
- MIME: application/x-www-form-urlencoded
- args: app - RTMP的application名称
name - 当前推流的流名称
addr - 客户端地址
## 部署说明
### Windows
- 直接运行
Windows 版本 EasyDSS 流媒体服务器运行比较简单,直接运行 `start.bat` 即可,此时可以在 Windows 进程管理器中可以看到 EasyDSS 的进程运行,这里有两点需要注意:
1. EasyDSS 采用的是多进程模式,所以任务管理器中可能会有多个 `EasyDSS.exe` 进程;
2. EasyDSS 运行日志无控制台显示,日志记录在 `logs/error.log`;
- 以服务的形式运行
以服务的形式运行程序, 能够达到开机自启动的目的, 方便维护. 在发布包的根目录下有两个脚本文件 `install service.bat` 和 `uninstall service.bat`, 分别用来安装和卸载 EasyDSS 服务.
### Linux
- 启动服务,运行 easydss 目录里面的 `start.sh`;
cd easydss
./start.sh
- 停止服务,运行 `stop.sh` 即可;
cd easydss
./stop.sh
> 启动服务后,在浏览器中打开测试页面,http://ip:10088
## 业务调用方案
### 点播调用
- 以 Windows 文件点播为例
我们将切片好的demo目录放置到EasyDSS服务器的www目录中,例如:
`www/videos`
那么demo文件的点播地址就是:
`http://{ip}:10088/videos/demo/video.m3u8`
### 直播调用
- 单次直播/录像/检索/回放流程
以单次的警用单兵设备直播为例,在警用单兵 APP 中,以每一次案件或者警员出勤为例,我们为每一例案件或者出勤分配一个32位的 ID,然后再调用 EasyRTMP 推送到对应 EasyDSS 流媒体服务器,推送到:
`rtmp://{ip}:{port}/hls/{ID}`
>{ip} 为 EasyDSS 流媒体服务器 IP 地址,公网演示用的地址为:`www.easydss.com`
>
>{port} 为直播推流端口,默认为 10085
>
>{ID} 为本次直播的案件 ID 或者出勤记录 ID
例如:我们推送到
`rtmp://www.easydss.com:10085/hls/b344ab65-0767-448e-beef-b3c7b3344dc4`
那么本次直播现场的实时播放地址为:
`rtmp://www.easydss.com:10085/hls/b344ab65-0767-448e-beef-b3c7b3344dc4`
本次直播的实时录像回放地址可通过 **[视频回看接口](#playback)** 获取, 再根据侦办过程中的具体时间,对 Playback 地址进行回放即可;
这样就能够将每一次侦办过程的直播、录像、检索、回放整个流程非常完美地完成!
### 服务接口
服务对外提供 HTTP RESTful 接口, 方便业务系统集成调用.
#### 获取直播列表
GET /api/v1/getlivesessions
返回结果示例:
{
"EasyDSS" : {
"Body" : {
"SessionCount" : 1,
"Sessions" : {
"Sessions" : [
{
"Application" : "hls",
"AudioBitrate" : 0,
"AudioChannel" : 2,
"AudioCodec" : "AAC",
"AudioSampleRate" : 8000,
"AudioSampleSize" : 16,
"HLS" : "/hls/Livestream/Livestream_live.m3u8",
"HTTP-FLV" : "/hls/Livestream.flv",
"Id" : "Livestream",
"InBitrate" : 0,
"InBytes" : 167498,
"NumOutputs" : 0,
"OutBitrate" : 0,
"OutBytes" : 0,
"RTMP" : "rtmp://192.168.99.199:10085/hls/Livestream",
"RTSP" : "rtsp://192.168.99.199:554/Livestream",
"StartTime" : 1561102585655,
"Time" : "0h 0m 9s",
"VideoBitrate" : 0,
"VideoCodec" : "H264",
"VideoHeight" : 1280,
"VideoWidth" : 720
}
]
}
},
"Header" : {
"Build" : "2019.0620.105128",
"Copyright" : "www.easydss.com",
"Version" : "v3.0"
}
}
}
| 字段 | 说明 |
| ------------ | ------------------ |
| Id | 直播流ID |
| Application | 直播类型,分为 live 和 hls |
| HLS | hls直播地址 |
| RTMP | rtmp直播地址 |
| HTTP-FLV | http-flv直播地址 |
| RTSP | rtsp直播地址 |
| InBitrate | 推流输入码率 |
| OutBitrate | 播放输出码率 |
| VideoBitrate | 视频码率 |
| AudioBitrate | 音频码率 |
| InBytes | 推流总流量 |
| OutBytes | 客户端播放总流量 |
| NumOutputs | 客户端播放人数 |
| Time | 直播时长 |
| AudioChannel | 音频通道数 |
| AudioCodec | 音频编码格式 |
| AudioSampleRate | 音频采样率 |
| AudioSampleSize | 音频采样大小 |
| StartTime | 直播开始时间 |
| VideoCodec | 视频编码格式 |
| VideoHeight | 视频高 |
| VideoWidth | 视频宽 |
#### 视频回看接口
##### 请求回看设备列表
GET /api/v1/query_record_devices
返回结果示例:
{
"msg": "success",
"code": 0,
"data": {
"devices": [
"stream_1000",
"stream_1001"
]
}
}
| 字段 | 说明 |
| ------- | -------- |
| devices | 设备 ID 数组 |
##### 按月检索录像接口
GET /api/v1/query_record_monthly?id=xxx&period=yyyyMM
| 参数 | 类型 | 说明 |
| :----- | :----- | :--------------------- |
| id | string | 指明设备id |
| period | string | 格式yyyyMM, 指明查询哪个月的录像记录 |
返回结果示例:
{
"data": {
"flags" : "00001100..."
},
"code": 0,
"msg": "成功"
}
| 字段 | 类型 | 说明 |
| :---- | :----- | :-------------------------------- |
| flags | string | 固定长度31,每一位只能是"1"或"0", 分别表示当日有没有录像 |
##### 按日检索录像接口
GET /api/v1/query_record_daily?id=xxx&period=yyyyMMdd
| 参数 | 类型 | 说明 |
| :----- | :----- | :----------------------- |
| id | string | 指明设备id |
| period | string | 格式yyyyMMdd, 指明查询哪一天的录像记录 |
返回结果示例:
{
"data": {
"list" : [{
"start_time" : "20170731000000",
"duration" : 90.00,
"hls" : "/xxx/20170731000000/xxx_record.m3u8",
"snap" : "/xxx/20170731000000/xxx_snap.png"
},{
"start_time" : "20170731010020",
"duration" : 89.00,
"hls" : "/xxx/20170731010020/xxx_record.m3u8",
"snap" : "/xxx/20170731010020/xxx_snap.png"
}]
},
"code": 0,
"msg": "成功"
}
| 字段 | 类型 | 说明 |
| :--------- | :------ | :------------------------- |
| start_time | string | 录像开始时间, 格式: yyyyMMddHHmmss |
| duration | integer | 录像历时,单位:秒 |
| hls | string | 录像文件地址 |
| snap | string | 录像快照地址 |
##### 下载录像视频
GET /api/v1/download_video?id=xxx&time=yyyyMMddHHmmss
| 参数 | 类型 | 说明 |
| :--- | :----- | :-------------------------------- |
| id | string | 指明设备id |
| time | string | 格式yyyyMMddHHmmss, 所要下载录像视频的起始录制时间 |
返回结果示例:
{
"data": {
"url" : "/hls/1031/20180115/20180115153245/tmp.mp4"
},
"code": 0,
"msg": "success"
}
| 字段 | 类型 | 说明 |
| :--------- | :------ | :------------------------- |
| url | string | 录像 mp4 文件下载地址 |
> **注:** 接口返回录像mp4文件下载地址, 客户端立即访问可能404, 因为后台合成mp4文件需要一定时间,客户端可以发起一组循环探测,一旦下载地址不再是404,即可启动下载
##### 删除录像视频(按设备)
GET /api/v1/delete_files_device?id=xxx
| 参数 | 类型 | 说明 |
| :--- | :----- | :----- |
| id | string | 指明设备id |
>注: 不可删除正在推流且开启录像设备录像视频, 业务层可通过[获取直播列表接口](#getlivesessions)确认指定设备是否处于推流且开启录像状态
##### 删除录像视频(按月)
GET /api/v1/delete_files_monthly?id=xxx&period=yyyyMM
| 参数 | 类型 | 说明 |
| :----- | :----- | :--------------------- |
| id | string | 指明设备id |
| period | string | 格式yyyyMM, 指明删除哪个月的录像记录 |
>注: 不可删除正在推流且开启录像设备的**当月**录像视频, 业务层可通过[获取直播列表接口](#getlivesessions)确认指定设备是否处于推流且开启录像状态
##### 删除录像视频(按日)
GET /api/v1/delete_files_daily?id=xxx&period=yyyyMMdd
| 参数 | 类型 | 说明 |
| :----- | :----- | :----------------------- |
| id | string | 指明设备id |
| period | string | 格式yyyyMMdd, 指明删除哪一天的录像记录 |
>注: 不可删除正在推流且开启录像设备的**当日**录像视频, 业务层可通过[获取直播列表接口](#getlivesessions)确认指定设备是否处于推流且开启录像状态
##### 删除录像视频(按录像文件)
GET /api/v1/delete_file?id=xxx&period=yyyyMMdd&filename=yyyyMMddHHmmss
| 参数 | 类型 | 说明 |
| :------- | :----- | :------------------------------ |
| id | string | 指明设备id |
| period | string | 格式yyyyMMdd, 指明删除哪一天的录像记录 |
| filename | string | 格式yyyyMMddHHmmss, 指明删除当天哪一条录像文件 |
>注: 不可删除正在推流且开启录像设备的**当日**录像视频, 业务层可通过[获取直播列表接口](#getlivesessions)确认指定设备是否处于推流且开启录像状态
#### 获取基础配置信息
GET /api/v1/getbaseconfig
返回结果示例:
{
"EasyDSS" : {
"Body" : {
"HTTPWanPort" : 10088,
"RTMPWanPort" : 10085,
"ServerWanIP" : "127.0.0.1"
},
"Header" : {
"Build" : "2019.0620.105128",
"Copyright" : "www.easydss.com",
"Version" : "v3.0"
}
}
}
| 字段 | 说明 |
| ----------- | ------- |
| HTTPWanPort | HTTP 端口 |
| RTMPWanPort | RTMP端口 |
| ServerWanIP | 服务器IP |
#### 获取服务运行信息 ####
GET /api/v1/getserverinfo
返回结果示例:
{
"EasyDSS" : {
"Body" : {
"Hardware" : "x86",
"InterfaceVersion" : "v1",
"LiveCount" : "0,20",
"ProductType" : 0,
"RunningTime" : "0 Days 0 Hours 0 Mins 23 Secs",
"Server" : "EasyDSS-Kernel",
"Validity" : "Validity Time Left: 9 day(s)",
"VirtualLiveCount" : "0,20"
},
"Header" : {
"Build" : "2019.0620.105128",
"Copyright" : "www.easydss.com",
"Version" : "v3.0"
}
}
}
| 字段 | 说明 |
| ---------------- | -------- |
| Hardware | 硬件信息硬件信息 |
| InterfaceVersion | 接口版本 |
| RunningTime | 运行时间 |
| Server | 软件信息 |
| Validity | 授权信息 |
## 更多流媒体音视频资源
EasyDarwin开源流媒体服务器:www.EasyDarwin.org
EasyDSS高性能互联网直播服务:www.EasyDSS.com
EasyNVR安防视频可视化服务:www.EasyNVR.com
EasyNVS视频综合管理平台:www.EasyNVS.com
EasyNTS云组网:www.EasyNTS.com
EasyGBS国标GB/T28181服务器:www.EasyGBS.com
EasyRTS应急指挥平台:www.EasyRTS.com
TSINGSEE青犀开放平台:open.TSINGSEE.com
Copyright © www.TSINGSEE.com Team 2012-2019
