跳转至

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 仓库 中找到此模块的其他配置提示和文档。