nginx怎么样配置rtmp推流服务器
nginx怎么样配置rtmp推流服务器
Nginx RTMP 服务器配置指南
要配置 Nginx 作为 RTMP 推流服务器,你需要安装和配置 nginx-rtmp-module 模块。以下是完整的配置步骤:
1. 安装 Nginx 和 RTMP 模块
在 Ubuntu/Debian 上安装:
# 安装依赖
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev
# 下载 Nginx 和 RTMP 模块
wget http://nginx.org/download/nginx-1.25.3.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz -O nginx-rtmp-module-1.2.2.tar.gz
# 解压
tar -zxvf nginx-1.25.3.tar.gz
tar -zxvf nginx-rtmp-module-1.2.2.tar.gz
# 编译安装
cd nginx-1.25.3
./configure --add-module=../nginx-rtmp-module-1.2.2 --with-http_ssl_module
make
sudo make install
2. 配置 Nginx RTMP 服务器
编辑 Nginx 配置文件(通常位于 /usr/local/nginx/conf/nginx.conf 或 /etc/nginx/nginx.conf):
worker_processes auto;
events {
worker_connections 1024;
}
# RTMP 配置
rtmp {
server {
listen 1935; # RTMP 默认端口
chunk_size 4096;
application live {
live on;
record off;
# 推流认证(可选)
# on_publish http://localhost/auth;
# HLS 支持(可选)
# hls on;
# hls_path /tmp/hls;
# hls_fragment 3;
# hls_playlist_length 60;
# 转码(可选)
# exec ffmpeg -i rtmp://localhost/live/$name -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://localhost/hls/$name;
}
# 另一个应用示例
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 5s;
}
}
}
# HTTP 服务器(用于 HLS 或状态页面)
http {
server {
listen 80;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /path/to/nginx-rtmp-module/;
}
# HLS 播放
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
}
}
3. 启动 Nginx
sudo /usr/local/nginx/sbin/nginx
# 或
sudo systemctl start nginx
4. 测试推流和播放
推流 (使用 OBS 或 FFmpeg):
rtmp://your-server-ip/live/stream-key
播放 (使用 VLC 或 FFplay):
rtmp://your-server-ip/live/stream-key
5. 高级配置选项
访问控制:
application live {
live on;
allow publish 192.168.1.0/24; # 允许推流的IP范围
deny publish all; # 拒绝其他所有
}
转码配置:
application live {
live on;
exec ffmpeg -i rtmp://localhost/live/$name
-c:v libx264 -preset veryfast -profile:v baseline -level 3.0
-c:a aac -b:a 128k -ar 44100
-f flv rtmp://localhost/live360p/$name;
}
DVR 录制:
application live {
live on;
record all;
record_path /var/rec;
record_unique on;
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
record_interval 30m;
}
6. 安全建议
-
使用防火墙限制 RTMP 端口 (1935) 的访问
-
考虑设置推流认证
-
对于生产环境,建议使用 HTTPS 和身份验证
这样你就配置好了一个基本的 RTMP 推流服务器。根据你的具体需求,可以进一步调整配置。
http是必须的吗?只加载rtmp模块,可以吗
仅配置 RTMP 模块而不启用 HTTP 服务器
是的,可以只配置 RTMP 模块而不启用 HTTP 服务器。HTTP 服务器部分是可选的,主要用于提供 HLS 流、状态监控页面或静态文件服务。如果只需要纯 RTMP 功能,完全可以省略 HTTP 配置部分。
最小化 RTMP 配置示例
worker_processes 1;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935; # RTMP 默认端口
chunk_size 4096;
application live {
live on; # 启用直播
record off; # 禁用录制
}
}
}
这样配置的特点
-
仅 RTMP 功能:只处理 RTMP 协议,不提供 HTTP 相关服务
-
更轻量:不加载 HTTP 模块,内存占用更少
-
更安全:减少 HTTP 服务可能带来的攻击面
-
性能更高:专注于流媒体传输
编译时注意事项
如果确定不需要 HTTP 功能,可以在编译时进一步精简:
./configure --add-module=../nginx-rtmp-module \
--without-http \
--without-http_rewrite_module \
--without-http_gzip_module
使用场景建议
纯 RTMP 配置适合以下场景:
-
只需要推流/拉流功能
-
客户端都支持 RTMP 协议
-
不需要 HLS 或 DASH 等 HTTP 流
-
不需要状态监控页面
如果需要添加 HTTP 功能,后期可以随时修改配置文件并重载 Nginx。
如何使用 OBS 或 FFmpeg 向 Nginx RTMP 服务器推流
当你配置好 Nginx RTMP 服务器后,需要使用推流软件将视频内容发送到服务器。以下是使用 OBS Studio 和 FFmpeg 进行推流的详细方法:
1. 使用 OBS Studio 推流
OBS Studio 是最常用的免费开源推流软件,适合直播场景。
安装 OBS Studio
-
官网下载: https://obsproject.com
-
Windows/macOS/Linux 都支持
配置 OBS 推流步骤
-
打开 OBS → 点击右下角"设置"按钮
-
选择"推流"选项卡
-
配置服务器和流密钥:
服务: 自定义 服务器: rtmp://你的服务器IP/live 流密钥: 任意你设置的流名称(如: test123)
(示例:
rtmp://192.168.1.100/live/test123) -
点击"确定"保存设置
-
在"来源"面板添加视频源(如显示器采集、摄像头、视频文件等)
-
点击右下角"开始推流"按钮
2. 使用 FFmpeg 推流
FFmpeg 是命令行工具,适合自动化推流或处理文件推流。
安装 FFmpeg
-
Linux:
sudo apt install ffmpeg(Ubuntu/Debian) -
macOS:
brew install ffmpeg -
Windows: 从官网下载编译版本
基本推流命令
# 推送摄像头视频(linux)
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset ultrafast -f flv rtmp://服务器IP/live/流密钥
# 推送屏幕(linux)
ffmpeg -f x11grab -s 1920x1080 -i :0.0 -c:v libx264 -preset ultrafast -f flv rtmp://服务器IP/live/流密钥
# 推送视频文件
ffmpeg -re -i 视频文件.mp4 -c:v copy -c:a copy -f flv rtmp://服务器IP/live/流密钥
常用参数说明
-
-re: 以原始帧率推送(对文件重要) -
-c:v copy: 视频流不重新编码 -
-preset ultrafast: 最快编码速度(适合直播) -
-f flv: 输出格式为FLV(RTMP需要)
3. 测试播放推流
配置好推流后,可以用以下方式测试播放:
-
VLC 播放器:
-
媒体 → 打开网络串流 → 输入
rtmp://服务器IP/live/流密钥
-
-
FFplay:
ffplay rtmp://服务器IP/live/流密钥
-
OBS 本身:
-
添加"媒体源"或"VLC视频源"输入RTMP地址
-
4. 常见问题解决
-
连接被拒绝:
-
检查服务器防火墙是否开放1935端口
-
sudo ufw allow 1935(Ubuntu)
-
-
延迟高:
-
在OBS中降低输出分辨率/比特率
-
在FFmpeg中使用
-preset ultrafast
-
-
认证问题:
-
如果服务器配置了认证,需要在URL中添加参数:
rtmp://服务器IP/live/流密钥?user=xxx&pass=xxx
-
通过以上方法,你就可以成功将视频流推送到自己搭建的Nginx RTMP服务器了。
-
前面提到obs推流和ffmpeg推送,看懂了,但是这两个已经将流推出来了,那么nginx的推流服务器又是什么
您的问题非常好,这里确实需要明确区分几个概念。让我用更清晰的方式解释整个流程:
1. 角色分工
整个直播系统包含三个关键角色:
-
推流客户端(OBS/FFmpeg):负责采集、编码并发送视频流
-
流媒体服务器(Nginx RTMP):负责接收、中转和分发视频流
-
播放客户端(VLC/播放器):负责接收并播放视频流
2. 为什么需要Nginx RTMP服务器?
当您直接用OBS/FFmpeg推流时,实际上可以直连播放端(点对点模式),但这样会有严重限制:
| 场景 | 直连播放端 | 通过Nginx RTMP中转 |
|---|---|---|
| 观众数量 | 只能1对1 | 支持1对多(成千上万观众) |
| 网络穿透 | 需要复杂NAT配置 | 服务器有公网IP即可 |
| 协议转换 | 只能RTMP | 可转HLS/DASH等多协议 |
| 录制功能 | 无 | 支持服务器录制 |
| 带宽压力 | 推流端直接承担 | 由服务器分担 |
3. 典型工作流程
4. Nginx RTMP服务器的核心功能
您的nginx.conf中 rtmp {} 模块实现了:
-
中继分发:将1路输入流复制给多个观众
-
协议转换:可同时输出RTMP/FLV/HLS等多种格式
-
访问控制:通过
allow publish/play限制IP -
流管理:通过
on_publish实现推流鉴权 -
录制回放:
record指令自动保存直播内容
5. 实际应用场景示例
案例:游戏主播直播
-
主播用OBS推流到
rtmp://your-server/live/game123 -
Nginx服务器:
-
给网页播放器提供HLS流
http://your-server/hls/game123.m3u8 -
给手机APP提供RTMP流
rtmp://your-server/live/game123 -
自动录制到
/videos/game123-20230801.flv
-
-
观众通过不同设备同时观看
6. 关键结论
-
Nginx不是推流源,而是流媒体中转站
-
推流端和播放端都连接Nginx,由它做"交通调度"
-
这种架构是直播平台的通用方案(类似Twitch/斗鱼的简化版)
如果需要测试,您可以:
-
在本地同时运行OBS和VLC
-
推流到
rtmp://localhost/live/test -
用VLC播放同一个地址
-
此时Nginx就在默默完成流中转工作
配置 Nginx RTMP 服务器自动录像
在 Nginx RTMP 模块中配置自动录像功能非常简单,以下是详细的配置方法和相关说明:
基础录像配置
在您的 nginx.conf 文件中的 RTMP 应用部分添加录制指令:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
# 开启录制功能
record all; # 录制所有发布流
record_path /var/rec; # 录像存储目录
record_unique on; # 文件名添加时间戳避免冲突
record_suffix _%Y-%m-%d_%H-%M-%S.flv; # 文件命名格式
# 可选:只录制音频或视频
# record_video on;
# record_audio on;
}
}
}
高级录像配置选项
1. 分段录制
record_interval 30m; # 每30分钟分段录制
record_max_size 2G; # 每个文件最大2GB
2. 只录制特定流
record notify; # 仅当收到 on_publish_notify 时开始录制
3. 不同录制格式
record_suffix -%Y%m%d%H%M%S.mp4; # 录制为MP4格式(需要支持)
完整配置示例
rtmp {
server {
listen 1935;
application live {
live on;
record all;
record_path /var/rec;
record_unique on;
record_suffix _%Y%m%d_%H%M%S.flv;
record_interval 1h;
record_max_size 4G;
# 录像完成后执行脚本(可选)
exec_record_done /usr/local/bin/convert_recording.sh $path $basename;
}
}
}
必要操作步骤
-
创建录像存储目录:
sudo mkdir -p /var/rec sudo chown -R www-data:www-data /var/rec # 确保Nginx有写入权限 -
重新加载Nginx配置:
sudo nginx -s reload -
测试推流:
ffmpeg -re -i test.mp4 -c copy -f flv rtmp://localhost/live/teststream
录像文件处理
录制完成后,您可以通过以下方式处理录像文件:
-
自动转码脚本示例 (
/usr/local/bin/convert_recording.sh):#!/bin/bash INPUT=$1 BASENAME=$2 OUTPUT="/var/rec/converted/${BASENAME}.mp4" ffmpeg -i $INPUT -c:v libx264 -preset fast -c:a aac $OUTPUT -
设置定时清理旧录像:
# 每天凌晨清理7天前的录像 0 0 * * * find /var/rec -type f -mtime +7 -exec rm {} \;
注意事项
-
确保磁盘空间充足,录像会占用大量空间
-
FLV格式兼容性最好,MP4需要分段录制才能播放
-
录像会增加服务器CPU和IO负载
-
对于生产环境,建议将录像存储在独立磁盘或NAS上
这样配置后,您的Nginx RTMP服务器就会自动录制所有直播内容,并按您设定的规则存储和管理录像文件。
RTMP 延迟优化与替代方案
针对您提到的 RTMP 延迟和卡顿问题,我将从优化方案和替代协议两个角度为您分析解决方案。
一、RTMP 延迟优化方案
1. 降低延迟的核心参数调整(Nginx配置)
rtmp {
server {
listen 1935;
chunk_size 4096;
buflen 500ms; # 关键:减少缓冲区时间
application live {
live on;
# 延迟优化关键参数
wait_key on; # 确保视频关键帧同步
wait_video off; # 减少视频等待
idle_streams off; # 关闭空闲流检测
# 低延迟模式
meta copy; # 不重新生成元数据
interleave on; # 音视频交错传输
}
}
}
2. 推流端优化(OBS/FFmpeg)
OBS设置建议:
-
输出模式 → 高级
-
关键帧间隔 → 1秒
-
预设 → 超快(ultrafast)
-
编码器 → 硬件编码(NVENC/AMF/QSV)
-
比特率 → 根据网络调整(建议测试确定)
FFmpeg推流示例:
ffmpeg -i input -c:v libx264 -preset ultrafast -tune zerolatency \
-g 30 -x264-params keyint=30:min-keyint=30 \
-c:a aac -f flv rtmp://server/app/stream
3. 网络优化方案
| 问题类型 | 解决方案 |
|---|---|
| 带宽不足 | 降低分辨率(720p)→比特率(2000kbps) |
| 网络抖动 | 推流端设置FEC(前向纠错) |
| 服务器负载 | 增加worker_processes和worker_connections |
| 跨运营商 | 部署CDN或边缘节点 |
二、RTMP卡顿的常见原因及排查
1. 问题诊断流程
OBS丢帧
正常
timeout
buffer full
CPU高
带宽满
出现卡顿
推流端查看
降低编码参数
服务器检查
nginx错误日志
调整keepalive
增加chunk_size
服务器负载
限制转码
扩容带宽
2. 关键指标监控命令
# 实时查看服务器状态
ffmpeg -i rtmp://server/app/stream -f null - # 测试拉流延迟
# Nginx状态监控
tail -f /var/log/nginx/error.log | grep rtmp
# 网络质量测试
ping -i 0.1 server
mtr --report server
三、低延迟替代方案对比
1. 协议对比表
| 协议 | 延迟 | 兼容性 | 适用场景 | 实现方式 |
|---|---|---|---|---|
| RTMP | 3-5s | 最好 | 传统直播 | nginx-rtmp |
| WebRTC | <1s | 浏览器原生 | 视频会议 | SRS/Janus |
| SRT | 1-3s | 需要客户端 | 专业直播 | srt-live-server |
| HLS LL | 3-10s | 苹果生态 | 移动端 | hls.js |
| HTTP-FLV | 2-3s | 网页端 | Web直播 | flv.js |
2. 推荐替代方案实现
方案1:WebRTC超低延迟
# SRS服务器配置(替代nginx-rtmp)
listen 1935; # 兼容RTMP
listen 8000/udp; # WebRTC端口
# 启动SRS
./objs/srs -c conf/rtc.conf
方案2:SRT协议
# 推流端
ffmpeg -i input -c copy -f mpegts "srt://server:9000?streamid=publish/live/stream"
# 服务器
srt-live-transmit "srt://:9000?mode=listener" "rtmp://localhost/live/stream"
方案3:低延迟HLS
application live {
hls on;
hls_path /tmp/hls;
hls_fragment 1s; # 常规HLS用3s
hls_playlist_length 3s;
hls_base_url http://cdn.example.com/hls/;
}
四、终极优化建议
-
硬件加速:
# Nginx支持GPU转码 exec_push ffmpeg -i rtmp://localhost/live/$name -c:v h264_nvenc ... -
边缘计算架构:
推流端 → 边缘节点(就近接入) → 中心集群 → CDN分发
-
智能码率适配:
application live { exec_push ffmpeg -i rtmp://localhost/live/$name \ -filter_complex "split=3[out1][out2][out3]" \ -map "[out1]" -c:v:0 libx264 -b:v:0 2000k -f flv rtmp://localhost/live_high/$name \ -map "[out2]" -c:v:1 libx264 -b:v:1 1000k -f flv rtmp://localhost/live_medium/$name; }
实际选择方案时,建议先通过ffmpeg -i your_stream分析具体瓶颈,再针对性优化。对于关键业务场景,建议使用WebRTC+SRT混合架构实现最优效果。

浙公网安备 33010602011771号