

























要配置 Nginx 作为 RTMP 推流服务器,你需要安装和配置 nginx-rtmp-module 模块。以下是完整的配置步骤:
编辑 Nginx 配置文件(通常位于 /usr/local/nginx/conf/nginx.conf 或 /etc/nginx/nginx.conf):
worker_processes auto;
events {
worker_connections 1024;
}
sudo /usr/local/nginx/sbin/nginx
rtmp://your-server-ip/live/stream-key
rtmp://your-server-ip/live/stream-key
application live {
live on;
allow publish 192.168.1.0/24;
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;
}
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;
}
使用防火墙限制 RTMP 端口 (1935) 的访问
考虑设置推流认证
对于生产环境,建议使用 HTTPS 和身份验证
这样你就配置好了一个基本的 RTMP 推流服务器。根据你的具体需求,可以进一步调整配置。
是的,可以只配置 RTMP 模块而不启用 HTTP 服务器。HTTP 服务器部分是可选的,主要用于提供 HLS 流、状态监控页面或静态文件服务。如果只需要纯 RTMP 功能,完全可以省略 HTTP 配置部分。
worker_processes 1;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
仅 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 服务器后,需要使用推流软件将视频内容发送到服务器。以下是使用 OBS Studio 和 FFmpeg 进行推流的详细方法:
OBS Studio 是最常用的免费开源推流软件,适合直播场景。
官网下载: https://obsproject.com
Windows/macOS/Linux 都支持
打开 OBS → 点击右下角"设置"按钮
选择"推流"选项卡
配置服务器和流密钥:
服务: 自定义 服务器: rtmp://你的服务器IP/live 流密钥: 任意你设置的流名称(如: test123)
(示例: rtmp://192.168.1.100/live/test123)
点击"确定"保存设置
在"来源"面板添加视频源(如显示器采集、摄像头、视频文件等)
点击右下角"开始推流"按钮
FFmpeg 是命令行工具,适合自动化推流或处理文件推流。
Linux: sudo apt install ffmpeg (Ubuntu/Debian)
macOS: brew install ffmpeg
Windows: 从官网下载编译版本
-re: 以原始帧率推送(对文件重要)
-c:v copy: 视频流不重新编码
-preset ultrafast: 最快编码速度(适合直播)
-f flv: 输出格式为FLV(RTMP需要)
配置好推流后,可以用以下方式测试播放:
VLC 播放器:
媒体 → 打开网络串流 → 输入 rtmp://服务器IP/live/流密钥
FFplay:
ffplay rtmp://服务器IP/live/流密钥
OBS 本身:
添加"媒体源"或"VLC视频源"输入RTMP地址
连接被拒绝:
检查服务器防火墙是否开放1935端口
sudo ufw allow 1935 (Ubuntu)
延迟高:
在OBS中降低输出分辨率/比特率
在FFmpeg中使用-preset ultrafast
认证问题:
如果服务器配置了认证,需要在URL中添加参数:rtmp://服务器IP/live/流密钥?user=xxx&pass=xxx
通过以上方法,你就可以成功将视频流推送到自己搭建的Nginx RTMP服务器了。
您的问题非常好,这里确实需要明确区分几个概念。让我用更清晰的方式解释整个流程:
整个直播系统包含三个关键角色:
推流客户端(OBS/FFmpeg):负责采集、编码并发送视频流
流媒体服务器(Nginx RTMP):负责接收、中转和分发视频流
播放客户端(VLC/播放器):负责接收并播放视频流
当您直接用OBS/FFmpeg推流时,实际上可以直连播放端(点对点模式),但这样会有严重限制:
| 场景 | 直连播放端 | 通过Nginx RTMP中转 |
|---|---|---|
| 观众数量 | 只能1对1 | 支持1对多(成千上万观众) |
| 网络穿透 | 需要复杂NAT配置 | 服务器有公网IP即可 |
| 协议转换 | 只能RTMP | 可转HLS/DASH等多协议 |
| 录制功能 | 无 | 支持服务器录制 |
| 带宽压力 | 推流端直接承担 | 由服务器分担 |
Player3Player2Player1播放端(VLC/浏览器)Nginx RTMP服务器推流端(OBS/FFmpeg)Player3Player2Player1播放端(VLC/浏览器)Nginx RTMP服务器推流端(OBS/FFmpeg)推送RTMP流 (rtmp://server/live/streamkey)分发RTMP流分发RTMP流分发HLS流 (http://server/hls/stream.m3u8)
您的nginx.conf中 rtmp {} 模块实现了:
中继分发:将1路输入流复制给多个观众
协议转换:可同时输出RTMP/FLV/HLS等多种格式
访问控制:通过allow publish/play限制IP
流管理:通过on_publish实现推流鉴权
录制回放:record指令自动保存直播内容
案例:游戏主播直播
主播用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
观众通过不同设备同时观看
Nginx不是推流源,而是流媒体中转站
推流端和播放端都连接Nginx,由它做"交通调度"
这种架构是直播平台的通用方案(类似Twitch/斗鱼的简化版)
如果需要测试,您可以:
在本地同时运行OBS和VLC
推流到 rtmp://localhost/live/test
用VLC播放同一个地址
此时Nginx就在默默完成流中转工作
在 Nginx RTMP 模块中配置自动录像功能非常简单,以下是详细的配置方法和相关说明:
在您的 nginx.conf 文件中的 RTMP 应用部分添加录制指令:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record_suffix -%Y%m%d%H%M%S.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;
创建录像存储目录:
sudo mkdir -p /var/rec
sudo chown -R www-data:www-data /var/rec
重新加载Nginx配置:
测试推流:
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
设置定时清理旧录像:
确保磁盘空间充足,录像会占用大量空间
FLV格式兼容性最好,MP4需要分段录制才能播放
录像会增加服务器CPU和IO负载
对于生产环境,建议将录像存储在独立磁盘或NAS上
这样配置后,您的Nginx RTMP服务器就会自动录制所有直播内容,并按您设定的规则存储和管理录像文件。
还有一个性能问题,发现rtmp延时稍大,有没有替代的方案,还有rtmp有时播放会卡不流传,影响因素是什么,怎样提高。
针对您提到的 RTMP 延迟和卡顿问题,我将从优化方案和替代协议两个角度为您分析解决方案。
rtmp {
server {
listen 1935;
chunk_size 4096;
buflen 500ms;
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
| 问题类型 | 解决方案 |
|---|---|
| 带宽不足 | 降低分辨率(720p)→比特率(2000kbps) |
| 网络抖动 | 推流端设置FEC(前向纠错) |
| 服务器负载 | 增加worker_processes和worker_connections |
| 跨运营商 | 部署CDN或边缘节点 |
OBS丢帧
正常
timeout
buffer full
CPU高
带宽满
出现卡顿
推流端查看
降低编码参数
服务器检查
nginx错误日志
调整keepalive
增加chunk_size
服务器负载
限制转码
扩容带宽
| 协议 | 延迟 | 兼容性 | 适用场景 | 实现方式 |
|---|---|---|---|---|
| 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 |
application live {
hls on;
hls_path /tmp/hls;
hls_fragment 1s;
硬件加速:
边缘计算架构:
推流端 → 边缘节点(就近接入) → 中心集群 → 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混合架构实现最优效果。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。