准备 RTMP

下载 rtmp

cd /usr/local/src
git clone https://github.com/arut/nginx-rtmp-module.git
cd /usr/local/src/nginx

增加模块

./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module

编译

make
make install

备份 nginx

mv /usr/local/nginx/sbin/nginx{,_`date +%F`}

替换 nginx

cp objs/nginx /usr/local/nginx/sbin

验证

nginx -V

测试

service nginx restart
# 排错:systemctl status nginx.service

配置参数 nginx.conf

server 节点内添加

# 配置 stat 面板
location /stat {
 rtmp_stat all;
 rtmp_stat_stylesheet stat.xsl;
}
# 定义 stat.xsl 路径
location /stat.xsl {
 root /usr/local/src/nginx-rtmp-module;    # 路径必须有读取权限
}

# 开启 hls,支持 iOS 设备
location /hls {
 types {
    application/vnd.apple.mpegurl m3u8;
    #application/x-mpegURL;
    video/mp2t ts;
 }
 root /data/wwwroot/default/demo;    # 流媒体目录
 add_header Cache-Control no-cache;
}

http 节点后添加

rtmp {
 server {
 listen 1935;                # 服务端口
    chunk_size 4096;            # 数据传输块大小

    # 应用列表
    application live{
     live on;                    # 推流名称为 live 并打开应用
     hls on;                     # 开启 HLS 实时回放功能,和在线播放视频无区别
     hls_path /data/wwwroot/default/demo;    #OBS 推流后存放流媒体目录
     wait_key on;                # 保护媒体文件,防止产生擦擦卡卡声音和彩色马赛克
     hls_fragment 10s;         # 单个媒体文件时间长度,也许会对卡顿有优化
     hls_playlist_length 60s;    # 回看时间范围
     hls_continuous on;         # 连续模式
     hls_cleanup on;             # 多余媒体清理
    }
 }
}

生效

service nginx restart

防火墙

路径

/etc/iptables.up.rules

增加

-A INPUT -p tcp -m state --state NEW -m tcp --dport 1935 -j ACCEPT

生效

iptables-restore < /etc/iptables.up.rules

OBS 推流

推流 URL:rtmp://localhost/live
流名称:demo

播放测试

RTMP:rtmp://localhost/live/demo
HTTP:http://localhost/demo/demo.m3u8
stat 面板:http://localhost/stat

其它

整体推流到拉流间存在延迟现象严重,这里只是简单搭建一个直播平台。影响延迟因素,涉及主机处理流媒体文件能力,以及 ts 文件串联需要花费大量时间。打开 m3u8 文件会有一些参数可查看。

参数解释

Nginx RTMP 模块 nginx-rtmp-module 指令详解

格式兼容

https://segmentfault.com/a/1190000009121042