rtmp: NGINX RTMP 模块
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7、8、9 和 10
- CentOS 7、8、9
- AlmaLinux 8、9
- Rocky Linux 8、9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-rtmp
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-rtmp
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用模块:
load_module modules/ngx_rtmp_module.so;
本文档描述了 nginx-module-rtmp v1.2.2,于 2025 年 7 月 5 日发布。
nginx-rtmp-module
项目博客
http://nginx-rtmp.blogspot.com
Wiki 手册
https://github.com/arut/nginx-rtmp-module/wiki/Directives
Google 组
https://groups.google.com/group/nginx-rtmp
https://groups.google.com/group/nginx-rtmp-ru (俄语)
功能
-
RTMP/HLS/MPEG-DASH 直播流
-
RTMP 点播 FLV/MP4, 从本地文件系统或 HTTP 播放
-
支持分布式流的流中继: 推送和拉取模型
-
以多个 FLV 格式录制流
-
支持 H264/AAC
-
使用 FFmpeg 进行在线转码
-
HTTP 回调(发布/播放/录制/更新等)
-
在特定事件上运行外部程序(exec)
-
用于录制音频/视频和断开客户端的 HTTP 控制模块
-
高级缓冲技术 将内存分配保持在最低水平 以实现更快的流和较低的 内存占用
-
已证明与 Wirecast、FMS、Wowza、 JWPlayer、FlowPlayer、StrobeMediaPlayback、 ffmpeg、avconv、rtmpdump、flvstreamer 等许多其他工具兼容
-
以机器可读和人类可读的形式提供 XML/XSL 统计信息
-
Linux/FreeBSD/MacOS/Windows
Windows 限制
Windows 支持有限。以下功能不受支持:
- execs
- static pulls
- auto_push
RTMP URL 格式
rtmp://rtmp.example.com/app[/name]
app - 应与配置中的 application {} 块之一匹配
name - 由每个应用程序解释 可以为空
多工作进程直播
模块支持通过自动流推送到 nginx 工作进程进行多工作进程直播。此选项通过 rtmp_auto_push 指令切换。
示例 nginx.conf
rtmp {
server {
listen 1935;
chunk_size 4000;
# 电视模式:一个发布者,多个订阅者
application mytv {
# 启用直播
live on;
# 录制流的前 1K
record all;
record_path /tmp/av;
record_max_size 1K;
# 将当前时间戳附加到每个 flv
record_unique on;
# 仅允许从本地主机发布
allow publish 127.0.0.1;
deny publish all;
#allow play all;
}
# 转码(需要 ffmpeg)
application big {
live on;
# 每次发布流时运行此命令(ffmpeg)
# 使用替换:$app/${app},$name/${name} 作为应用程序和流名称。
#
# 此 ffmpeg 调用从此应用程序接收流 &
# 将分辨率降低到 32x32。流被发布到
# 'small' 应用程序(见下文)下的同名。
#
# ffmpeg 可以对流执行任何操作,例如视频/音频
# 转码、调整大小、改变容器/编解码器参数等
#
# 可以指定多个 exec 行。
exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
-f flv rtmp://localhost:1935/small/${name};
}
application small {
live on;
# 降低分辨率的视频从 ffmpeg 传入
}
application webcam {
live on;
# 从本地网络摄像头流
exec_static ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an
-f flv rtmp://localhost:1935/webcam/mystream;
}
application mypush {
live on;
# 每个在此发布的流
# 会自动推送到
# 这两台机器
push rtmp1.example.com;
push rtmp2.example.com:1934;
}
application mypull {
live on;
# 从远程机器拉取所有流
# 并在本地播放
pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
}
application mystaticpull {
live on;
# 静态拉取在 nginx 启动时开始
pull rtmp://rtmp4.example.com pageUrl=www.example.com/index.html name=mystream static;
}
# 点播
application vod {
play /var/flvs;
}
application vod2 {
play /var/mp4s;
}
# 多个发布者,多个订阅者
# 无检查,无录制
application videochat {
live on;
# 以下通知接收所有
# 会话变量以及
# HTTP POST 请求中的特定调用参数
# 发起 HTTP 请求并使用 HTTP 返回码
# 来决定是否允许从此连接发布
on_publish http://localhost:8080/publish;
# 播放时同样
on_play http://localhost:8080/play;
# 发布/播放结束(在断开连接时重复)
on_done http://localhost:8080/done;
# 上述所有通知接收
# 标准 connect() 参数以及
# play/publish 参数。如果任何参数通过
# GET 风格语法发送到 play 和 publish
# 这些也会被包含。
# 示例 URL:
# rtmp://localhost/myapp/mystream?a=b&c=d
# 每 2 分钟录制 10 个视频关键帧(无音频)
record keyframes;
record_path /tmp/vc;
record_max_frames 10;
record_interval 2m;
# 异步通知录制完成的 flv
on_record_done http://localhost:8080/record_done;
}
# HLS
# 为了使 HLS 工作,请在 tmpfs 中创建一个目录(此处为 /tmp/hls)
# 用于片段。目录内容通过 HTTP 提供(见
# 配置中的 http{} 部分)
#
# 输入流必须为 H264/AAC。对于 iPhone,请使用基线 H264
# 配置文件(见 ffmpeg 示例)。
# 此示例创建一个准备好用于 HLS 的电影 RTMP 流:
#
# ffmpeg -loglevel verbose -re -i movie.avi -vcodec libx264
# -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
# -f flv rtmp://localhost:1935/hls/movie
#
# 如果您需要转码直播流,请使用 'exec' 功能。
#
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
# MPEG-DASH 类似于 HLS
application dash {
live on;
dash on;
dash_path /tmp/dash;
}
}
}
# HTTP 可用于访问 RTMP 统计信息
http {
server {
listen 8080;
# 此 URL 提供 XML 格式的 RTMP 统计信息
location /stat {
rtmp_stat all;
# 使用此样式表在浏览器中查看 XML 为网页
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
# 用于查看 RTMP 统计信息的 XML 样式表。
# 将 stat.xsl 复制到您想要的任何位置
# 并在此处放置完整的目录路径
root /path/to/stat.xsl/;
}
location /hls {
# 提供 HLS 片段
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
location /dash {
# 提供 DASH 片段
root /tmp;
add_header Cache-Control no-cache;
}
}
}
多工作进程流示例
rtmp_auto_push on;
rtmp {
server {
listen 1935;
application mytv {
live on;
}
}
}
GitHub
您可以在 nginx-module-rtmp 的 GitHub 仓库 中找到此模块的其他配置提示和文档。