nms之流式服务器
nms——Go语言开发的高性能流媒体服务端
下载安装
Windows版
https://cdn.nodemedia.cn/nms/3.2.14/nms-windows-amd64-20200224.zip
解压缩后双击运行nms.exe
双击service.bat 安装为服务并自动运行
在当前目录打开控制台输出 service.bat uninstall 停止并卸载服务
Linux x86_64 版
https://cdn.nodemedia.cn/nms/3.2.14/nms-linux-amd64-20200224.tar.gz
解压缩后进入目录,在控制台输入 ./nms 运行
在当前程序目录下执行 sudo ./service.sh install 安装服务并自动运行
在当前程序目录下执行 sudo ./service.sh uninstall 停止并卸载服务
Docker版
docker run -it —name nms -p 1935:1935 -p 8000:8000 -p 8443:8443 -p 6935:6935/udp illuspas/nms
Linux arm64 版
https://cdn.nodemedia.cn/nms/3.2.14/nms-linux-arm64-20200224.tar.gz
支持华为鲲鹏云ARM64架构,KC1实例运行
支持Arm linux 嵌入式设备运行NMS,可作为局域网内部采集摄像头数据推送到公网的推流器。
运行稳定,维护成本低。
推荐的设备
NanoPi NEO Plus2
配置文件(config.ini)
[common]
; 服务绑定地址
bind =
; 授权码,程序运行后,将Machine ID值发给客服进行授权
license =
; admin_panel 是否开启后台管理面板,需要开启http或https服务
admin_panel = 1
; notify_url 当流创建和结束时以POST方式通知到该url,当通知创建时返回非200状态码,将中断该流
; notify_url = http://192.168.0.8:8008/notify
; gop_cache 是否开启gop cache, 该功能缓存最近的一段视频gop,使客户端能立刻开始解码秒开。
; 但在服务端有大量推流时需要更多的内存, 根据码率×原视频关键帧间隔×并发量来计算。
gop_cache = 1
[log]
; trace, debug, info, warn, error
log_level = debug
; console or real log file path like ./log/nms.log
log_file = console
; log max day
log_maxday = 7
[av]
; 音频转码开关
; RTMP/FLV协议自动转其它音频编码为AAC
; JT1078协议自动转其它音频编码为G.711A
; WebRTC协议自动转其它音频编码为OPUS
transcode_audio = 1
[auth]
; 鉴权密码,鉴权码生成规则
; 原地址 rtmp://192.168.0.8/live/stream
; 加密算法 先获取有效期时间戳(当前时间+30秒过期)1574318274,md5(/live/stream-1574318274-authkey@2019)
; 最终地址 rtmp://192.168.0.8/live/stream?sign=1574318274-5a1ee174233631793a4091badf4ffec5
auth_key = authkey@2019
; 播放鉴权开关
auth_play = 0
; 推流鉴权开关
auth_push = 0
; API鉴权开关,打开后所有api调用需要设置header['authorization'] = login成功后返回的token
auth_api = 1
; API鉴权用户名,login时以json格式提交
; {
; "username": "admin",
; "password": "21232f297a57a5a743894a0e4a801fc3"
; }
auth_api_user = admin
; API鉴权密码,login时需要传md5后的值, 默认密码为弱口令,请注意修改
auth_api_pass = admin
[rtmp]
; rtmp协议端口
port = 1935
; rtmp协议chunk size
chunk_size = 60000
[http]
; http-flv/websocket-flv/hls协议端口
; API接口, AdminPanel复用该端口
port = 8000
[https]
; https-flv/wss-flv/hls 协议端口
port = 8443
key_file = key.pem
cert_file = cert.pem
[hls]
; hls_path 切片临时存放路径, 必须填入有效且可写入的路径. 若不设置,则不会生成hls切片
; hls_path = hls
; hls_time 切片时间, 单位秒, 默认2
; 经过这段时间后,将在下一个关键帧上剪切片段. 并不代表肯定会以这个设定值而切片,还要根据关键帧间隔而定.
; 低切片可有效降低hls延迟, 但也需要推流端使用固定的低关键帧间隔编码, 如果不固定关键帧间隔,会造成视频卡顿
hls_time = 2
; hls_list 最大播放条目, 默认3
hls_list = 3
[kmp]
; kmp协议监听, UDP端口
port = 6935
ffmpeg推流、拉流
NMS v3支持RTMP, HTTP-FLVT推流
① 使用ffmpeg读取本地文件,向nms推送RTMP流
1.1 INPUT_FILE.mp4 是h264+aac编码
ffmpeg -re -i INPUT_FILE.mp4 -c copy -f flv rtmp://server_ip/live/stream
1.2 INPUT_FILE.mp4 是h264+其他音频编码
ffmpeg -re -i INPUT_FILE.mp4 -c:v copy -c:a aac -f flv rtmp://server_ip/live/stream
1.3 INPUT_FILE.mp4 是其他音视频编码
ffmpeg -re -i INPUT_FILE.mp4 -c:v libx264 -tune zerolatency -c:a aac -f flv rtmp://server_ip/live/stream
② 使用ffmpeg读取本地文件,向nms推送HTTP-FLV流
INPUT_FILE.mp4 是h264+aac编码
ffmpeg -re -i INPUT_FILE.mp4 -c copy -f flv http://server_ip:8000/live/stream.flv
③ 使用ffmpeg读取RTSP流,向nms推送RTMP流
INPUT_RTSP 是h264+aac编码
ffmpeg -re -i rtsp://admin:admin@192.168.0.10/Streaming/Channels/101 -c copy -f flv rtmp://server_ip/live/stream
④ 使用ffmpeg读取本地H265视频,向nms推送RTMP流
Adobe官方定义RTMP,FLV是不支持H265的,需要使用打过补丁的ffmpeg.
linux_x64: https://cdn.nodemedia.cn/ffmpeg/ffmpeg-4.1.4-patch-0.tar.gz
windows_x64 : https://cdn.nodemedia.cn/ffmpeg/ffmpeg-4.1.4-patch-0.zip
从流媒体服务器播放视频
① 使用ffplay播放 rtmp流
ffplay rtmp://server_ip/live/stream
② 使用ffplay播放 http-flv流
ffplay http://server_ip:8000/live/stream.flv
③ 使用ffplay播放 hls流
ffplay http://server_ip:8000/live/stream.m3u8
④ 使用NodePlayer.js 播放 ws-flv流
//server_ip:8000/live/stream.flv
NMS 推流(NMS v3支持RTMP, HTTP-FLVT推流)
1. 使用ffmpeg读取本地文件,向nms推送RTMP流
1.1 INPUT_FILE.mp4 是h264+aac编码
ffmpeg -re -i 000.mp4 -c copy -f flv rtmp://192.168.31.50:1935/live/stream
1.2 INPUT_FILE.mp4 是h264+其他音频编码
ffmpeg -re -i INPUT_FILE.mp4 -c:v copy -c:a aac -f flv rtmp://server_ip/live/stream
1.3 INPUT_FILE.mp4 是其他音视频编码
ffmpeg -re -i 000.mp4 -c:v libx264 -tune zerolatency -c:a aac -f flv rtmp://192.168.31.100:1935/live/stream
2. 使用ffmpeg读取本地文件,向nms推送HTTP-FLV流
INPUT_FILE.mp4 是h264+aac编码
ffmpeg -re -i 000.mp4 -c copy -f flv rtmp://192.168.31.100:1935/live/stream.flv
3. 使用ffmpeg读取RTSP流,向nms推送RTMP流
INPUT_RTSP 是h264+aac编码
ffmpeg -re -i rtsp://admin:admin@192.168.0.10/Streaming/Channels/101 -c copy -f flv rtmp://server_ip/live/stream
4. 使用ffmpeg读取本地H265视频,向nms推送RTMP流
Adobe官方定义RTMP,FLV是不支持H265的,需要使用打过补丁的ffmpeg.
linux_x64: https://cdn.nodemedia.cn/ffmpeg/ffmpeg-4.1.4-patch-0.tar.gz
windows_x64 : https://cdn.nodemedia.cn/ffmpeg/ffmpeg-4.1.4-patch-0.zip
从流媒体服务器播放视频
1.使用ffplay播放 rtmp流
ffplay rtmp://server_ip/live/stream
2.使用ffplay播放 http-flv流
ffplay http://server_ip:8000/live/stream.flv
3.使用ffplay播放 hls流
ffplay http://server_ip:8000/live/stream.m3u8
4.使用NodePlayer.js 播放 ws-flv流
//server_ip:8000/live/stream.flv
备注
开启HLS功能
打开config.ini 删除hls_path前的注释 --------------------------------------------------------- [hls] ; hls_path 切片临时存放路径, 必须填入有效且可写入的路径. 若不设置,则不会生成hls切片 hls_path = hls ; hls_time 切片时间, 单位秒, 默认2 ; 经过这段时间后,将在下一个关键帧上剪切片段. 并不代表肯定会以这个设定值而切片,还要根据关键帧间 >隔而定. ; 低切片可有效降低hls延迟, 但也需要推流端使用固定的低关键帧间隔编码, 如果不固定关键帧间隔,会造成视频卡顿 hls_time = 2 ; hls_list 最大播放条目, 默认3 hls_list = 3 -------------------------------------------------------- 延迟说明 hls_time = 2 hls_list = 3 代表每2秒切片一个ts,m3u8列表中保持3个ts,这样算下来,延迟是6秒。 极限低延迟 hls_time = 1 hls_list = 2 播放方式 nms v3版的HLS流同样遵循 /app/stream 资源定位规范,只需要添加.m3u8后缀。 如推流地址: rtmp://server_ip/live/stream 则hls地址为 http://server_ip:8000/live/stream.m3u8 会话型HLS nginx-rtmp对HLS的实现模式,只是简单的在推流后只生成m3u8和ts文件,并提供http的静态文件服 > >务。无法进行会话管理,无法统计hls播放量,无法获得播放和结束的事件。 nmsv3的HLS实现,采用了session会话管理,可以定位访问资源的用户id,ip,访问参数,可以使用内置鉴权规则,可以统计播放量,可以统计用户使用的流量,可以获得用户开始播放和结束播放的事件。 H265/HEVC 编码的 HLS流 nms支持H265/HEVC编码的视频输出HLS流,m3u8采用v7,视频采用fMP4切片。
写在最后
欢迎留言私信讨论;
文章有知识性错误请立马联系博主,博主将非常感谢;
无需经过允许即可随意使用转载,知识本来就是被广泛用来学习的;
非常感谢您能看到此处,本文为博主学习笔记,如有不同见解,请不吝赐教。