免费流媒体服务器(AMS3.0 非AdobeMediaServer)

       自己从事流媒体近20载, 从没有可用的流媒体服务器到现在服务器遍地开花.  但尽管开源服务器众多,功能强大, 但却没有可以直接拿来使用的. 原因是配置安装困难,没有自己想要的接口,很难与现有系统对接.

       为解决这个问题, 自己就做了一个简单的安装包, 并且提供了众多的接口可以与WEB进行对接, 这样配置管理大大简化, 安装使用都非常简单.

       服务器单机下保守至少可以大码流3000并发, 性能非常不错.性能超CRtmpServer\FMS, 可以与NGINX-RTMP 相媲美. 比SRS使用更方便. 你可以做集群.提供HTTP RTMP 协议, 支持HLS.   rtmp协议做直播时能保证服务器产生的延迟不大于100毫秒,   目前有一家公司就是使用此服务做书法教学会议互动. 详细可以看下面的使用说明文档.

       我以前是自己开公司的,是一家老牌流媒体公司(业内都知道,不便透露), 现在这家公司只剩一个壳了, 卖了. 我现在不干了但出于爱好,把核心重新升级完善, 免费贡献给大家使用. 目前北京还有4家公司在使用这个服务器核心做产品, 成都一家, 深圳一家.

      此流媒体服务有Windows版,  但Windows版有诸多的弊端且效率低, 后期我也都没有做同步更新, 你能在网上搜到的AMS KMS 都windows版的产品, 此处我只提供LINUX版流媒体服务核心, 你可以用它来做你自己的产品.

      它是CENTOS6.5中开发, 7.0也能正常运行.       其它系统版自己测试吧, 呵呵!

       欢迎大家来下载使用, 功能完全没有限制, 完全免费. 有问题可以留言.可以提出你宝贵的建议. 

大家有问题留言我会继续修改完善, 然后重新发布, 所以你要是使用, 可以定期上来看看, 下载资源看看版本号是不是改变了,反正我设的是0分  :- )

资源下载https://download.csdn.net/download/wanghaisheng/12609501

现在屏幕采集\录像\rtmp推流工具也完成了第一版,所以同步更新一下博文. 

https://blog.csdn.net/wanghaisheng/article/details/108237797

至此我们离毫秒级延迟又近了一步!! 大家给点鼓励呀, 让我能感觉到自己的价值. 呵呵

                                                                  AMS-SERVER安装与使用说明

                                                                                      MARK

 

  • 环境与安装

LINUX环境目前在CentOS6.5.x86_64下测试通过.

  1. 安装

ams-server-2.14.2-2.x86_64.rpm 为安装文件.

ffmpeg-4.1.3-5.x86_64.rpm为AMS指定依赖文件,此FFMPEG不是通用FFMPEG

将两文件放入到LINUX下,在同级目录下执行命令完成安装.

命令如下

> rpm -ivh ams-server-2.14.2-6.x86_64.rpm

> rpm -ivh ffmpeg-4.1.3-5.x86_64.rpm

如果是系统是MINI CENTOS版本ffmpeg安装有可能会出现依赖项缺失的情况, 此时可以运行 yum install libxcb* 后再安装ffmpeg, 注意要配好网络.

安装完成后可以在控制台执行如下命令进行操作:

       ams start       启动AMS服务器

ams stop        退出AMS服务器

ams restart     重启AMS服务器

ams reset       恢复运行配置到初始状态, 但通过接口看到的是最后的配置内容, 只有通过接口再次再次运行 set 命令后才会写入到运行配置.

ams reload      重新加载配置文件, 通常在使用接口配置完成服务器后再用此命令重新加载一下,当然也可以直接通过接口直接进行加载.

ams status     可以查看服务器是否在运行.

提供返回值可解析的命令, 可以完成启动停止和状态获取三个功能.

ams if_start    启动AMS服务器,  成功输出0, 失败输出1, 如果是已经启动返回是PID值

ams if_stop     退出AMS服务器,  成功输出0, 失败输出1.

ams if_status  可以查看服务器是否在运行.  正在运行返回0, 失败返回1.

  1. 卸载

执行如下命令完成卸载

>ams stop

> rpm -e ams-server

> rpm -e ffmpeg

  • 服务基本使用

服务器安装完成后,默认HTTP 端口为89, RTMP默认端口为1935.为了保证服务能正常在外部访问,请先关闭防火墙.

使用 http://IP:89/ 进行测试,如果能访问到服务器,那么会出现如下页面内容:

 

服务器提供两种协议的点播直播服务

  1. 直播

上传直播数据的地址连接形式如下:

rtmp://{ip}:{rtmp_port}/{app}/{streamname},

{app}  为应用名, 当为源服务器时 app 是 live; 若为边缘服务器时 app 是 publish. 是否为源服务器的角色可以在设置中把”org”变量设为1.

{streamname}为流名称.

在上传数据后可以使用两种协议进行观看:

RTMP    rtmp://{ip}:{rtmp_port}/live/{streamname}

HTTP    http://{ip}:{http_port}/{streamname}/index.m3u8

  1. 点播

对于点播只支持MP4, 点播的地址格如下

RTMP   rtmp://{ip}:{rtmp_port}/vod/{name }

HTTP    http://{ip}:{http_port}/{name }

HTTP播放连接有两个固定参数, 这两个参数可以指播放文件的某一段, 连接的形式如下: http://192.168.1.200:89/1.mp4?start=20&end=40 这说明是只播放第20秒到40秒, 对于播放器来说就相当于是一个小文件, 时长为20秒.  Start参数没有默认为开始0, end参数没有为播放至文件结束.

服务内部已经内置了一个点播节目,名称为1.mp4,可以直接进行访问测试

  • 服务器配置

服务器配置接口格式:

http://{ip}:{http_port}/cfg/{cmd}

所有的请求方法都要使用POST,否则内部不会进行处理,并且目前密码认证还没有加入,参数传递暂时使用POST参数的形式,后面会修改为JSON.

其中的{cmd}命令变量有三个如下:

  1. get     此命令是查看当前服务器的配置情况

 返回值为POST参数串如下:

hls_fragment=2&hls_playlist_length=4&rtmp_port=1935&http_port=88&http_notify=http://192.168.1.65:80/onplay.php&rtmp_notify=http://192.168.1.65:80/onplay.php&enable_http_vod_s_notify=1&enable_http_vod_e_notify=0&enable_http_live_s_notify=0&enable_http_live_e_notify=0&enable_rtmp_vod_s_notify=0&enable_rtmp_vod_e_notify=0&enable_rtmp_live_s_notify=0&enable_rtmp_live_e_notify=0&enable_rtmp_publish_s_notify=1&enable_rtmp_publish_e_notify=1&enable_rtmp_update_notify=0& allow_addr=192.169.1.65&record_path=/var/ams &upload_path=/var/ams/upload&enable_rtmp_record_process=1&enable_rtmp_record_manual=0&enable_http_upload_process=1&update_interval=30&org=0&rtmp_org_addr=rtmp://192.168.20.142:1935/live&http_org_addr=http://192.168.20.142:89"

  1. set             是设置服务的配置

设置时可以设置某一个参数,也可同时设置多个参数,当多个参数时同样也用POST参数格式进行发送.

  1. reload   在重设配置后,配置是不会立即生效的,只是做了配置的保存.要想生效只有重启服务器或使用此命令来加载配置.在重启的之后,原来提供服务的连接不会立刻断开,但不会再接受新连接.

参数说明

hls_fragment                  hls单切片时长,单位秒           

hls_playlist_length       HLS总切片时长,单位秒

rtmp_port                           RTMP协议监听端口

http_port                          HTTP协议监听端口

http_notify                          HTTP事件通知接口

rtmp_notify                        RTMP事件通知接口

enable_http_vod_s_notify       是否启用HTTP点播播放通知认证,1为是0为否

enable_http_vod_e_notify   是否启用HTTP点播结束通知,1为是0为否

enable_http_live_s_notify   是否启用HTTP直播播放通知认证,1为是0为否

enable_http_live_e_notify   是否启用HTTP直播播放结束通知,1为是0为否

enable_rtmp_vod_s_notify      是否启用rtmp点播播放通知认证,1为是0为否

enable_rtmp_vod_e_notify   是否启用rtmp点播结束通知,1为是0为否

enable_rtmp_live_s_notify   是否启用rtmp直播播放通知认证,1为是0为否

enable_rtmp_live_e_notify   是否启用rtmp直播播放结束通知,1为是0为否

enable_rtmp_publish_s_notify 是否启用RTMP发布开始通知

enable_rtmp_publish_e_notify 是否启用RTMP发布结束通知

enable_rtmp_update_notify   是否启用 RTMP 直播点播动态通知

allow_addr                                                  对于配置和控制接口调用时的允许地址.默认值为 all .   可以为一个单一的IP址值,也可是一个段 如 192.168.1.0/24 . 但无论何 127.0.0.1是可以使用的

record_path                                               录生成时的保存路路径,默认值为/var/ams,这个也是默认媒体库的位置. 如果是想直接用文件名进行播放时,请不要修改此变量.

upload_path                                               文件上传时的保存路径,默认值为/var/ams/upload

enable_rtmp_record_process               是否启用录像文件的处理过程,当启用之后会在录像完成后再对录像文件转封装为MP4, 并向通过接口向接口服务器发送类型为record_transfer_done的文件信息通知,默认开启,值为1, 0为不开启.

注意: 开启时rtmp_notify要正确的接口地址设值,否则无法向外发送通知.

enable_rtmp_record_manual       是否启用手动录像模式, 默认是自动,即有流上传就自动开始录像. 如果开启那么只用调用相应接口来启动停止某一路录像. 0为自动, 1为手动.

enable_http_upload_process                 是否启用上传文件的处理过程,当启用之后会在上传完成后再对上传文件转码为MP4, 如果是MP4文件那么将对文件进行快速播放处理. 并向通过接口向接口服务器发送类型为upload_transfer_done的文件信息通知,默认开启,值为1, 0为不开启. (这一部分功能好像没有实现完成,  大家可以先自己试一下, 时间太长了我自己都忘了 )

update_interval                                         直播发布的信息更新时间间隔

org                                                                默认为1,

表示是源服务器, 当单机使用时就是为源服务器,

rtmp_org_addr                                          当org的值为0时,即作边缘服务器时一定设置源服务器的拉推流址. 格式如前面示例.

http_org_addr                                           当org的值为0时,即作边缘服务器时一定设置源服务器的文件获取地址. 在此为点播文件的获取地址

 

注意: 对于HTTP的直点播的开始通知都是可以使用的,都是可以进行认证操作.但对于直播结束的通知由于受HTTP协议的限制,很可能是不断的断开重连,所以时间和流量要不断的累加计算, 使用起来效率并不是很高. 点播时只要文件下载完毕连接就会断开,所以结束时时间参数并不是用户的真正观看时间,最好是使用流量来统计.

鉴于HTTP连接的不确定性,推荐使用RTMP连接协议,只有在必须使用HTTP连接的再使用HTTP协议

  • 回调接口说明

对于所有的接口返回的都是POST form参数,如果客户端请求时带有参数,比如用户名密码认证信息之类的,那么也会被在回调参数中出现, 参数对于RTMP及HTTP又略有不同.请看后面详细说明.

设置 RTMP/HTTP 流发布或播放回调。每次一个客户连接执行任务时,一个 HTTP 请求异步发送,命令处理会挂起 - 直到它返回结果码。之后再解析 HTTP 结果码。

* HTTP 2XX 返回码继续 RTMP/HTTP 会话。

* 其他返回码RTMP/HTTP 连接丢弃。终止客户端的连接

当客户断开连接时也会发起一个异步通知,连同其它通知一样回调后无论返回何HTTP CODE 都会认为是成功了. 但最好是返回200,这样内部能正常结束这个通知连接.

  1. 点播播放文件的指定

点播两种协议,在通知回复时要加入下面的http头信息,如

'Filename:{path}'  例: 'Filename:/var/ams/1.mp4'

要确保这个路径能被核心服务器读取,否则不能播放.

如果不使用Filename 的HTTP头,那么服务器会自动到默认媒体库中寻找文件进行播放.

  1. 录像控制

录像可能通过设置接口设为自动或手动,但此时是统一设置, 不能具体到每一上传流. 如果想对每路发布流进行控制,请在服务器设置中把enable_rtmp_record_manual设为1. 然后在流发布回调的回复中加入http协议头信息进行指定. 如下:

rec_path:/var/media       用来指定录像文件的存储位置, 注意路径必须存在,并且不以’/’结尾; 只要此流进行录像就会保存在这个路径下.

rec_name:myrecfile       用来指定录像时的文件名称, 不需要文件扩展名. 生成的文件名格式如下myrecfile_20190625004733.mp4

is_rec:1                                      指定是否录像, 如果为1则此流录像,否则不会录像.

  1. RTMP 回调接口返回值
  1. RTMP通知公共回调参数, 在上传播放开始时都会存在的参数如下

"app"                                 表示当前应用 ,当前应用类型如下

"Live"   直播

"vod"        点播

"clientid"                            客户端连接ID,在控制接口中可能会使用此参数指定客户端

"call"                                   回调类型 目前支持如下类型

"publish"                            直播节目上传开始

"publish_done"                  直播节目上传结束

"play"                                  播放开始

"play_done"                        播放结束

"record_transfer_done"           录像处理结束

"update_publish"   直播上传时的动态更新

"name"                               当前频道的名字 或 点播文件名称

"addr"                                 连接客户端的IP

 

  1. 在流发布或播放结束时或者动态更新通知时会出现如下的参数

"time"                       当前客户端的连接时长, 单位是秒

"timestamp"     当前客户端上传或播放的时间戳, 单位是毫秒

"totlebyte"              当前客户端的使用流量,字节为单位

  1. 在动态更新时的线路质量参数

“dropped”      当前线路的丢包数       

  1. 录像处理结束(record_transfer_done),参数如下

"duration"     文件时长, 单位秒

"size"         文件大小, 字节BYTE

"fps"          帧率

"bitrate"      平均码流, 单位bit

"wh"           宽高

" filepath"     生成录像文件的全路径,包括文件名称. 如果文件不存在值为”NONE”, 当录像文件有问题时可能是FLV文件,正常为MP4.

“filename”   录像文件的名字.当录像文件有问题时可能是FLV文件,正常为MP4.

“streamname”  录像文件的数据源,即流名称

"jpgpath"          生成录像截图文件的全路径, 如果截图失败值为”NONE”

“error”      是否过程中出现错误, 正确时值为0, 错误时为错误码.                      

录像结束后进行文件分析转储过程,在分析转存完成后才进行回调通知, 此时已经生了MP4文件以及相关的信息截图等.

此外此回调中的公共参数只有”call”一个,可以以此来辨别处理过程.

record_transfer_done是通过rtmp_notify进行的, 如果需要获悉此文件的关联信息,回调中有相关的参数.   

此回调是模拟了FORM提交的方式进行的POST数据传输, 因此除携带了POST参数信息外还提交了一个”file”的截图文件, 此回调在服务器请求失败时会隔5  10  15   20秒各请求一次,总共4次.

 

  1. HTTP 回调接口返回值
  1. HTTP通知公共回调参数, 在上传播放开始时都会存在的参数如下

"app"                                 表示当前应用 ,当前应用类型如下

"http_Live"   直播

"http_vod"       点播

"clientid"                           客户端连接ID,在控制接口中可能会使用此参数指定客户端

"call"                                   回调类型 目前支持如下类型

"play"                                  播放开始

"play_done"                        播放结束

“upload_transfer_done” 文件上传处理结束通知

"name"                              当前频道URI或点播文件名称 只会在通知开始时出现

"addr"                                连接客户端的IP

"curTime"                          指当前通知产生的时间

  1. 播放结束通知时会出现如下的参数

"time"                                 当前客户端的连接时长, 单位是秒

"totlebyte"                       当前客户端的使用流量,字节为单位

  1. 文件上传处理结束(upload_transfer_done ),参数如下   

"duration"             文件时长, 单位秒

"size"               文件大小, 字节BYTE

"fps"               帧率

"bitrate"            平均码流, 单位bit

"wh"               宽高

"file"                上传最终生成文件的全路径,上传文件正确处理完成后,原上传文件将被删除,只剩处理完成后MP4文件,此时参数值为MP4文件的路径, 当处理错误时此变量的值可能就是上传时的文件, 文件格式就是上传时的格式.

filename”          文件名称

"jpgpath"               生成录像截图文件的全路径,如果截图失败值为”NONE”

“error”             是否过程中出现错误, 正确时值为0, 错误时为错误码.

注意此回调中的公共参数只有”call”一个,可以以此来辨别处理过程.

        upload_transfer_done是通过http_notify进行的,请在相应接口通知中进行处理.此回调是模拟了FORM提交的方式进行的POST数据传输, 因此除携带了POST参数信息外还提交了一个”file”的截图文件, 此回调在服务器请求失败时会隔5秒请求一次,总共4次.

  • 控制接口说明

控制接口都是httpget方法

  1. 录像控制接口

格式如下:

http://{IP}:{HTTP_PORT}/control/record/start|stop?app=live&rec=rec&name={NAME}

  • start|stop     可以选择一个即可, start为启动录像, stop为停止录像, 录像模块
  • app=live      目前这个被固化, 照样设置就可以,预留扩展
  • rec=rec       目前这个被固化, 照样设置就可以,预留扩展
  • name={NAME}     这个是录像时生成的文件名称, 最终生成时会在后面追加一个时间 如{NAME}为 live1  那么录像生成的文件名称可能为live1_20190321173926.flv

成功返回录像文件地址

  1. 踢除客户端
  1. RTMP客户端踢除接口格式如下:

http://{IP}:{HTTP_PORT}/control/drop/publisher|client? name={NAME}&addr={ADDR}&clientid={CLIENTID}

参数说明

  • publisher|client - publisher只能操作发布者, client可以操作所有客户端包含                               发布端.命令操作完成后会返回断开的连接数.
  • name         – 通知是指路踢除直播客户端使用, 如果不指定addr和clientid那么踢除这个直播通道下的所有客户端.对于点播不起效
  • addr          – 客户端的连接地址,如果此项不指定并且clientid也不指定将是所有.此项是指更为具体的描述客户端,只用在drop/client命令中生效.
  • clientid        – 用户连接后返回的clientId, 如果此项不指定并且addr也不指定将是所有.

返回值

执行后会返回当前被踢掉的客户端个数

例子

 

踢除名为live1且地址为192.168.1.65的所有客户端

http://192.168.1.144:89/control/drop/client?name=live1&addr=192.168.1.65

 

踢除名为live1的发布端,同时把所有名字为live1的所有播放端一并删除,返回值只有publisher的连接数

http://192.168.1.144:89/control/drop/publisher?name=live1

 

踢除clientid=985的发布端

http://192.168.1.144:89/control/drop/publisher?clientid=985

 

踢除所有发布端,同时把所有名字为live1的所有播放端一并删除

http://192.168.1.144:89/control/drop/publisher

 

踢除所有客户端,包含发布端和接收端

http://192.168.1.144:89/control/drop/client

 

 

踢除频道live1的所有客户端,包括上传端和播放端

http://192.168.1.144:89/control/drop/client?name=live1

 

踢除指定的客户端, 不管是上传端还是播放端

http://192.168.1.144:89/control/drop/client?clientid=737

 

  1. HTTP客户端踢除接口格式如下

http://{IP}:{HTTP_PORT}/cfg/drop?clientid={CLIENTID}

参数说明

clientid – 用户连接后返回的clientId

对于HTTP客户端的删除都是一对一的,没有其它复杂的参数选项.

返回值:

成功返回 result=OK

失败返回 result=FAILED

 

  1. HTTP媒体文件删除接口格式如下

http://{IP}:{HTTP_PORT}/cfg/delf?flie={filepath}

参数说明

filepath– 将要删除的媒体文件全路径

 

返回值:

成功返回 result=OK

失败返回 result=FAILED

 

  • 系统运行状态信息
  1. 系统运行信息查看接口
  1. 接口:

http://{IP}:{89}/stat

  1. 说明:

此接口可以直接在浏览器中打开,以图表的方式进行当前过行信息的展示,如下:

 

 

  1. 系统运行概要信息获取接口
  1. 接口:

http://{IP}:{89}/stat/sys

  1. 说明

该接口仅支持GET方法, 正确返回200状态码并返回 xml字符串如下:

<?xml version="1.0" encoding="UTF-8"?>

<sta max_client="10000" max_stream="10000" http_kbps="0" http_live_cn="0" http_vod_cn="0" rtmp_out_kbps="0" rtmp_in_kbps="678" rtmp_vod_cn="0" rtmp_live_cn="0" rtmp_publish_cn="2"/>

参数说明

rtmp_publish_cn:    当前rtmp发布的流数目, 同时会对应一路的HTTP直播发布

rtmp_play_cn         RTMP 当前的播放连接数目

rtmp_in_kbps        RTMP 当前入口带宽

rtmp_out_kbps       RTMP 当前出口带宽

http_vod_cn         HTTP 当前点播连接数

http_live_cn        HTTP 当前直播的连接数

http_kbps           HTTP 当前的带宽情况

max_stream          最大发布流数

max_client          最大播放客户端数

 

 

  1. 获取当前会话连接的详情
  1. 接口:

http://{IP}:{89}/stat/all|channel|live|vod

  1. 说明

该接口仅支持GET方法, 正确返回200状态码并返回 xml字符串,如下:

标签<live>中的子元素<stream>是直播流, 有多少个上传发布就会有多少个<stream>, <stream>中子元素<client>是当前流中的所有连接客户端的信息,这里面的连接有两种, 当属性publishing=1时说明是发布连接,这种连接在一个流中只会存在一个, 当publishing=0时说明是接收连接,这种连接会有多个,有多少个用户在接收观看就会产生多少个.

标签<play>中的子元素<stream>是点播流, 当前用户正在观看几个文件就会产生几个流. <stream>中子元素<client>是当前流中的所有连接客户端的信息,即有几个用户在观看这个节目就会产生几个<client>.

在服务器设计原则中可能会有多个服务<server>(目前只有一个服务),每个<server>会有多个<application> , 目前只会有一个name=”live”和name=”vod”的两个应用.每个<application>可能会有<live>或<play>,也可能两者都有,目前每个应用中只会有其一.

<stream>标签属性

name="live22"          当前节目名称

active="1"                             当前状态, 目前此值只为1.

time="65298"                      节目服务时间, 直播标签专用

bw_in="1653288"               输入带宽, 直播标签专用

bytes_in="11182307"        输入字节, 直播标签专用

bw_out="0"                          输出带宽, 直播标签专用

bytes_out="0"                     输出字节, 直播标签专用

bw_audio="247728"          音频带宽, 直播标签专用

bw_video="1405560"        视频带宽, 直播标签专用

publishing="1"                     说明是直播发布, 直播标签专用

 

<client>标签属性

id="1"                                           客户端ID

address="192.168.20.34"   客户端地址

time="65300"                        客户端的连接时间

totlebyte="11220500"           客户端总计发送字节

timestamp="65199"               当前发送数据的时间截

dropped="0"                              发送丢包数量, 点播不存在丢包值所以没有此属性

 

publishing="1"                   直播连接属性, 当为0时说明是播放连接, 1是发布连接

active="1"                             当前此值常量值1.

在标签中出现的多余属性是上传或播放地址后的附加参数, 你在地址后加入几个值,在属性中就会出现几个值.

猜你喜欢

转载自blog.csdn.net/wanghaisheng/article/details/107314417