续上一篇:《LNMP: nginx加装模块 nginx-rtmp-module》

接下来要实现我本地用OBS推流去这台机器,机器可以转换成rtmp外还可供H5设备播放的 .m3u8 格式 ts切片

配置不难

准备

1 先保证服务端已安装ffmpeg

apt-get -y install ffmpeg

2 保证nginx 已经安装 rtmp模块(参考上一篇日志)

修改 nginx.conf 配置文件

修改内容包括两处

  1. 添加 rtmp 协议 服务中增加一个application 名字叫 live(可自定义),配置见下文
  2. 在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 若显示如下
QQ截图20200720030038.png

有出现 live 则是ok鸟。
这个时候应该没有显示任何 live streams 的,这个是我配置好OBS正在推流中的截图

OBS推流设置

看截图,填写的推流地址是 rtmp://服务器IP/live 。live 对应nginx 的 rtmp server 的application 名称。
串流密钥自定义,填写的名称会作为流的名称。我这里填写了homecam(如果要多路同时推流,注意名称不要重复)
QQ截图20200720033318.png

确定保存,OBS的流媒体源(画面,音频)配置完毕就可以开始推流了。

此时查看 服务端的 /tmp/app

已经不断地刷新ts文件, 也生成了视频流的 .m3u8 文件,访问URL为 http://服务器IP/live/流名称.m3u8
对应到本例中则是

http://192.168.0.186/live/homecam.m3u8

刷新 http://192.168.0.186/stat 看到直播流的推流拉流状态

把这个资源地址在手机浏览器打开或配置到 H5播放器中,可以看到已经在直播

效果预览

QQ截图20200720030130.png
吃藕,不露全脸了

关于负载

由于没有做复杂的转码编码解码单路推流负载只占用 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合并起来。如果需要跨域则要额外配置解决。


参考文:

  1. Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器
  2. 使用ffmpeg+nginx将rtmp直播流转为hls直播流

标签: nginx, ffmpeg, 推流, 直播, hls, m3u8

添加新评论