CGJU
查工具网
2026年6月8日 · 阅读时长 8 分钟

Nginx-RTMP模块介绍

Nginx-RTMP是一个开源的Nginx第三方模块,由俄罗斯开发者Roman Arutyunyan开发。它为Nginx增加了RTMP(Real-Time Messaging Protocol)协议支持,可以将Nginx变成一个功能强大的流媒体服务器。

RTMP协议最初由Macromedia公司(后被Adobe收购)开发,用于Flash播放器和服务器之间的音视频传输。虽然Flash已经退出历史舞台,但RTMP协议因其低延迟、成熟稳定的特点,至今仍是直播推流的事实标准。

Nginx-RTMP的核心功能

  • RTMP推流和拉流:支持RTMP协议的直播推流和播放
  • HLS支持:实时将RTMP流转换为HLS格式
  • DASH支持:支持MPEG-DASH流媒体格式
  • 直播录制:将直播内容录制为视频文件
  • 实时转码:配合FFmpeg进行实时转码
  • 统计面板:内置统计信息页面
  • 直播控制:支持录制、停止、丢弃等控制命令

常见应用场景

  • 个人直播:搭建属于自己的直播平台
  • 企业内训:内部视频直播系统
  • 教育直播:在线课堂、远程教学
  • 游戏直播:游戏画面实时直播
  • 监控系统:摄像头流媒体转发

Ubuntu编译安装

在Ubuntu上安装Nginx-RTMP需要从源码编译,因为RTMP模块不是Nginx的官方模块。下面是详细的编译安装步骤。

步骤一:安装编译依赖

首先安装编译所需的依赖包:

sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev -y

步骤二:下载源码

下载Nginx和Nginx-RTMP模块的源码:

cd /usr/local/src
sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz
sudo wget https://github.com/arut/nginx-rtmp-module/archive/refs/heads/master.zip -O nginx-rtmp-module.zip
sudo tar zxvf nginx-1.24.0.tar.gz
sudo unzip nginx-rtmp-module.zip

步骤三:编译安装

配置编译参数,添加RTMP模块:

cd nginx-1.24.0
sudo ./configure \
  --prefix=/usr/local/nginx \
  --with-http_ssl_module \
  --add-module=../nginx-rtmp-module-master
sudo make
sudo make install

步骤四:创建系统服务

创建systemd服务文件,方便管理Nginx:

sudo tee /etc/systemd/system/nginx.service << EOF
[Unit]
Description=NGINX with RTMP module
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx

Windows安装

在Windows系统上,可以使用预编译的版本,省去编译的麻烦。

方法一:使用预编译版本

可以从GitHub上下载好心人编译好的Windows版本,或者使用以下方法:

# 1. 下载Nginx for Windows
# 从 http://nginx.org/en/download.html 下载

# 2. 下载nginx-rtmp-module
# 从 https://github.com/arut/nginx-rtmp-module 下载

# 注意:Windows版本需要特定编译,建议直接搜索现成的nginx-rtmp-win32版本

方法二:使用Docker

在Windows上使用Docker是更简单的方式:

docker run -d \
  --name nginx-rtmp \
  -p 1935:1935 \
  -p 8080:8080 \
  -v /path/to/nginx.conf:/etc/nginx/nginx.conf \
  tiangolo/nginx-rtmp

配置文件详解

Nginx-RTMP的配置文件是 nginx.conf,通常位于 /usr/local/nginx/conf/ 目录下。下面详细介绍各项配置。

基础配置

这是一个最基本的RTMP配置:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;
        }
    }
}
  • listen 1935:RTMP默认端口,必须开放防火墙
  • chunk_size:数据块大小,影响传输效率
  • application live:定义一个名为live的应用
  • live on:开启直播模式
  • record off:关闭录制功能

HLS配置

配置HLS输出,让直播流可以在网页中播放:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            hls on;
            hls_path /tmp/hls;
            hls_fragment 3;
            hls_playlist_length 15;
            hls_cleanup on;
            hls_sync 100ms;
        }
    }
}

http {
    server {
        listen 8080;

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}
  • hls on:开启HLS功能
  • hls_path:HLS分片和播放列表存储路径
  • hls_fragment:每个分片的时长(秒)
  • hls_playlist_length:播放列表总时长
  • hls_cleanup:自动清理过期分片
  • hls_sync:音视频同步时间差

DASH配置

配置MPEG-DASH支持:

application live {
    live on;
    record off;

    dash on;
    dash_path /tmp/dash;
    dash_fragment 2;
    dash_playlist_length 10;
    dash_format mp4;
}

多码率转码配置

配合FFmpeg实现实时多码率转码:

application live {
    live on;
    record off;

    exec ffmpeg -i rtmp://localhost/live/$name
      -c:v libx264 -crf 23 -preset veryfast -maxrate 2000k -bufsize 4000k -s 1280x720 -c:a aac -b:a 128k -f flv rtmp://localhost/live720/$name
      -c:v libx264 -crf 23 -preset veryfast -maxrate 1000k -bufsize 2000k -s 854x480 -c:a aac -b:a 96k -f flv rtmp://localhost/live480/$name
      -c:v libx264 -crf 23 -preset veryfast -maxrate 500k -bufsize 1000k -s 640x360 -c:a aac -b:a 64k -f flv rtmp://localhost/live360/$name;
}

application live720 {
    live on;
    record off;
    hls on;
    hls_path /tmp/hls/720p;
}

application live480 {
    live on;
    record off;
    hls on;
    hls_path /tmp/hls/480p;
}

application live360 {
    live on;
    record off;
    hls on;
    hls_path /tmp/hls/360p;
}

推流测试

使用FFmpeg推流

最简单的推流方式是使用FFmpeg:

# 推流本地文件
ffmpeg -re -i test.mp4 -c copy -f flv rtmp://服务器IP/live/stream1

# 推流屏幕
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset fast -pix_fmt yuv420p -f flv rtmp://服务器IP/live/stream1

使用OBS推流

OBS Studio是最流行的直播推流软件,配置方法如下:

  1. 打开OBS,点击"设置"
  2. 选择"推流"选项卡
  3. 服务选择"自定义..."
  4. 服务器填写:rtmp://服务器IP/live
  5. 串流密钥填写:stream1(可以自定义)
  6. 点击确定,然后点击"开始推流"

播放测试

使用ffplay或VLC播放RTMP流:

# FFplay播放
ffplay rtmp://服务器IP/live/stream1

# VLC播放
vlc rtmp://服务器IP/live/stream1

如果配置了HLS,也可以在浏览器中播放:

http://服务器IP:8080/hls/stream1.m3u8

HLS配置详解

HLS(HTTP Live Streaming)是Apple开发的流媒体协议,由于其基于HTTP、兼容性好的特点,被广泛用于网页直播和移动端播放。

HLS关键参数优化

  • hls_fragment:分片时长,建议2-4秒,越小延迟越低但文件越多
  • hls_playlist_length:播放列表长度,建议为分片的5-6倍
  • hls_sync:音视频同步,设置100ms通常足够
  • hls_start_number:播放列表起始序号

低延迟HLS配置

如果追求更低的延迟,可以这样配置:

hls on;
hls_path /tmp/hls;
hls_fragment 1;
hls_playlist_length 3;
hls_sync 50ms;
hls_cleanup on;
hls_delete_threshold 3;

这样配置可以将延迟降低到3-5秒左右,但会增加服务器压力和网络开销。

录制功能

Nginx-RTMP提供了强大的直播录制功能,可以将直播内容保存为视频文件。

录制配置选项

application live {
    live on;

    record all;
    record_path /tmp/records;
    record_suffix -%Y%m%d-%H%M%S.flv;
    record_unique on;
    record_max_size 1000M;
    record_max_files 5;
    record_interval 30m;

    # 录制完成后执行的脚本
    exec_record_done ffmpeg -i $path -c copy /path/to/$basename.mp4;
}
  • record:录制模式,off|all|audio|video
  • record_path:录制文件保存路径
  • record_suffix:文件名后缀,支持时间格式
  • record_unique:生成唯一文件名,避免覆盖
  • record_max_size:单个录制文件最大大小
  • record_max_files:最多保留文件数
  • record_interval:多久切片一个新文件

录制模式说明

  • off:关闭录制
  • all:录制音频和视频
  • audio:只录制音频
  • video:只录制视频

统计面板

Nginx-RTMP内置了统计功能,可以通过HTTP页面查看当前服务器状态和连接信息。

配置统计面板

http {
    server {
        listen 8080;

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /usr/local/src/nginx-rtmp-module-master/;
        }

        location /control {
            rtmp_control all;
        }
    }
}

访问统计面板

配置完成后,通过以下地址访问:

  • 统计页面:http://服务器IP:8080/stat
  • 控制接口:http://服务器IP:8080/control

统计面板显示的信息包括:

  • 当前活跃的流数量
  • 每个流的推流信息
  • 每个流的播放客户端数量
  • 上传和下载带宽
  • 连接时长等详细信息

控制接口

通过control接口可以远程控制直播:

  • record/start:开始录制
  • record/stop:停止录制
  • drop/publisher:断开推流
  • drop/subscriber:断开某个观众

常见问题与优化

1. 防火墙设置

确保防火墙开放了必要的端口:

# UFW防火墙
sudo ufw allow 1935/tcp
sudo ufw allow 8080/tcp

# iptables
sudo iptables -A INPUT -p tcp --dport 1935 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

2. 权限问题

确保Nginx有HLS分片目录的写入权限:

sudo mkdir -p /tmp/hls /tmp/records
sudo chown -R www-data:www-data /tmp/hls /tmp/records

3. 并发性能优化

调整Nginx配置提升并发能力:

worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 65535;
    use epoll;
    multi_accept on;
}

4. 推流鉴权

为了防止别人随意推流,可以添加鉴权:

application live {
    live on;
    record off;

    # 简单的URL鉴权
    on_publish http://localhost/auth;
}

# HTTP验证服务(示例)
location /auth {
    if ($arg_key = "your-secret-key") {
        return 200;
    }
    return 403;
}

总结

Nginx-RTMP是一个功能强大的开源流媒体服务器模块,通过它可以轻松搭建属于自己的直播系统。本文从模块介绍、安装部署、配置详解到功能使用,全面介绍了Nginx-RTMP的使用方法。

无论是个人直播、企业内训还是在线教育,Nginx-RTMP都能提供稳定可靠的流媒体服务。配合FFmpeg还可以实现更多高级功能,如实时转码、多码率输出等。

搭建好流媒体服务器后,你可以使用我们的 M3U8在线播放器 来测试HLS直播流的播放效果,直接在浏览器中输入HLS地址即可播放。

相关推荐

更多精彩文章和实用工具

想测试你的直播流?

使用我们的免费M3U8在线播放器,直接在浏览器中播放HLS直播流

立即体验 ➡