LNMP: nginx HLS 直播推流(feat. 视频监控)
续上一篇:《LNMP: nginx加装模块 nginx-rtmp-module》
接下来要实现我本地用OBS推流去这台机器,机器可以转换成rtmp外还可供H5设备播放的 .m3u8
格式 ts切片
配置不难
准备
1 先保证服务端已安装ffmpeg
apt-get -y install ffmpeg
2 保证nginx 已经安装 rtmp模块(参考上一篇日志)
修改 nginx.conf 配置文件
修改内容包括两处
- 添加 rtmp 协议 服务中增加一个application 名字叫 live(可自定义),配置见下文
- 在http 的server内 增加3个 location 映射路径
rtmp { #RTMP服务
server {
listen 1935; #服务端口
chunk_size 4096; #数据传输块
application live {
live on; #启用直播的推流
hls on; #开启hls
hls_path /tmp/app; #hls的ts切片存放路径
hls_fragment 2s; #本地切片长度
hls_playlist_length 8s;
}
}
}
……(略)
http {
……(略)
server {
……(略)
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /home/download/nginx-rtmp-module/; #此处填写 nginx-rtmp-module 所在路径
}
location /live {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/app/; #上面rtmp服务对应的 hls_path 路径
add_header Cache-Control no-cache;
}
……(略)
}
……(略)
}
修改完后重启 ngxin
验证配置是否正确
打开 http://服务端IP/stat
若显示如下
有出现 live
则是ok鸟。
这个时候应该没有显示任何 live streams 的,这个是我配置好OBS正在推流中的截图
OBS推流设置
看截图,填写的推流地址是 rtmp://服务器IP/live
。live 对应nginx 的 rtmp server 的application 名称。
串流密钥自定义,填写的名称会作为流的名称。我这里填写了homecam
(如果要多路同时推流,注意名称不要重复)
确定保存,OBS的流媒体源(画面,音频)配置完毕就可以开始推流了。
此时查看 服务端的 /tmp/app
已经不断地刷新ts文件, 也生成了视频流的 .m3u8
文件,访问URL为 http://服务器IP/live/流名称.m3u8
。
对应到本例中则是
刷新 http://192.168.0.186/stat
看到直播流的推流拉流状态
把这个资源地址在手机浏览器打开或配置到 H5播放器中,可以看到已经在直播
效果预览
吃藕,不露全脸了
关于负载
由于没有做复杂的转码编码解码单路推流负载只占用 0.1 以内, CPU是个低功耗的 Z8350 (软路由电视盒级别的弱鸡 4C CPU)
应该是完全没有问题,需要担心的更多是带宽如果多路同推的话能否够用。内网千兆应该是问题不大的。
可以见到切片路径会循环生成若干个 ts文件,超过配置的m3u8总时长的切片会自动删除。推流结束后,m3u8文件和ts文件会全部删除掉,并不占用空间,所以我把路径设置在了 /tmp 下。如果需要永久保存需要在nginx.conf 的 rtmp application 中额外配置 recorder
,也并不复杂。
实时监控主要的功能已经实现,稍作调整就可以实现回放和储存的 闭路电视监控的录像服务器了。 赞。
(可能硬件上要选配h.265的会好点,存储更有优势。)
后续一点问题
推流的延迟稍微有点大,直播画面延迟大约十几秒。我的测试全部是内网所以网络质量应该不是问题。不知道可以通过什么方式进行优化,将来有空再研究下。
题外话。在H5页面调用HLS(.m3u8)资源的时候提示网络连接失败,发现是跨域的问题。最初的设想 A机器OBS采集推流 B机器生成HLS资源 + C机器拉流播放 这样的结构初步是做不到,要 BC合并起来。如果需要跨域则要额外配置解决。
参考文:
