你的想法很重要-大家都来谈 (C)Copyright 2012 by WeiPt

nginx怎么样配置rtmp推流服务器

nginx怎么样配置rtmp推流服务器

 
 

Nginx RTMP 服务器配置指南

要配置 Nginx 作为 RTMP 推流服务器,你需要安装和配置 nginx-rtmp-module 模块。以下是完整的配置步骤:

1. 安装 Nginx 和 RTMP 模块

在 Ubuntu/Debian 上安装:

bash
 
复制
 
下载
# 安装依赖
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):

nginx
 
复制
 
下载
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

bash
 
复制
 
下载
sudo /usr/local/nginx/sbin/nginx
# 或
sudo systemctl start nginx

4. 测试推流和播放

推流 (使用 OBS 或 FFmpeg):

text
 
复制
 
下载
rtmp://your-server-ip/live/stream-key

播放 (使用 VLC 或 FFplay):

text
 
复制
 
下载
rtmp://your-server-ip/live/stream-key

5. 高级配置选项

访问控制:

nginx
 
复制
 
下载
application live {
    live on;
    allow publish 192.168.1.0/24;  # 允许推流的IP范围
    deny publish all;              # 拒绝其他所有
}

转码配置:

nginx
 
复制
 
下载
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 录制:

nginx
 
复制
 
下载
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. 安全建议

  1. 使用防火墙限制 RTMP 端口 (1935) 的访问

  2. 考虑设置推流认证

  3. 对于生产环境,建议使用 HTTPS 和身份验证

这样你就配置好了一个基本的 RTMP 推流服务器。根据你的具体需求,可以进一步调整配置。

 

http是必须的吗?只加载rtmp模块,可以吗

 
 

仅配置 RTMP 模块而不启用 HTTP 服务器

是的,可以只配置 RTMP 模块而不启用 HTTP 服务器。HTTP 服务器部分是可选的,主要用于提供 HLS 流、状态监控页面或静态文件服务。如果只需要纯 RTMP 功能,完全可以省略 HTTP 配置部分。

最小化 RTMP 配置示例

nginx
 
复制
 
下载
worker_processes  1;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;  # RTMP 默认端口
        chunk_size 4096;
        
        application live {
            live on;    # 启用直播
            record off; # 禁用录制
        }
    }
}

这样配置的特点

  1. 仅 RTMP 功能:只处理 RTMP 协议,不提供 HTTP 相关服务

  2. 更轻量:不加载 HTTP 模块,内存占用更少

  3. 更安全:减少 HTTP 服务可能带来的攻击面

  4. 性能更高:专注于流媒体传输

编译时注意事项

如果确定不需要 HTTP 功能,可以在编译时进一步精简:

bash
 
复制
 
下载
./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):什么意思,怎样用
 
 

如何使用 OBS 或 FFmpeg 向 Nginx RTMP 服务器推流

当你配置好 Nginx RTMP 服务器后,需要使用推流软件将视频内容发送到服务器。以下是使用 OBS Studio 和 FFmpeg 进行推流的详细方法:

1. 使用 OBS Studio 推流

OBS Studio 是最常用的免费开源推流软件,适合直播场景。

安装 OBS Studio

配置 OBS 推流步骤

  1. 打开 OBS → 点击右下角"设置"按钮

  2. 选择"推流"选项卡

  3. 配置服务器和流密钥:

    text
     
    复制
     
    下载
    服务: 自定义
    服务器: rtmp://你的服务器IP/live
    流密钥: 任意你设置的流名称(如: test123)

    (示例: rtmp://192.168.1.100/live/test123)

  4. 点击"确定"保存设置

  5. 在"来源"面板添加视频源(如显示器采集、摄像头、视频文件等)

  6. 点击右下角"开始推流"按钮

2. 使用 FFmpeg 推流

FFmpeg 是命令行工具,适合自动化推流或处理文件推流。

安装 FFmpeg

  • Linux: sudo apt install ffmpeg (Ubuntu/Debian)

  • macOS: brew install ffmpeg

  • Windows: 从官网下载编译版本

基本推流命令

bash
 
复制
 
下载
# 推送摄像头视频(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. 测试播放推流

配置好推流后,可以用以下方式测试播放:

  1. VLC 播放器:

    • 媒体 → 打开网络串流 → 输入 rtmp://服务器IP/live/流密钥

  2. FFplay:

    bash
     
    复制
     
    下载
    ffplay rtmp://服务器IP/live/流密钥
  3. OBS 本身:

    • 添加"媒体源"或"VLC视频源"输入RTMP地址

4. 常见问题解决

  1. 连接被拒绝:

    • 检查服务器防火墙是否开放1935端口

    • sudo ufw allow 1935 (Ubuntu)

  2. 延迟高:

    • 在OBS中降低输出分辨率/比特率

    • 在FFmpeg中使用-preset ultrafast

  3. 认证问题:

    • 如果服务器配置了认证,需要在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. 典型工作流程

图表
 
代码
 
 
 
 
 
下载
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)

4. Nginx RTMP服务器的核心功能

您的nginx.conf中 rtmp {} 模块实现了:

  • 中继分发:将1路输入流复制给多个观众

  • 协议转换:可同时输出RTMP/FLV/HLS等多种格式

  • 访问控制:通过allow publish/play限制IP

  • 流管理:通过on_publish实现推流鉴权

  • 录制回放:record指令自动保存直播内容


5. 实际应用场景示例

案例:游戏主播直播

  1. 主播用OBS推流到 rtmp://your-server/live/game123

  2. Nginx服务器:

    • 给网页播放器提供HLS流 http://your-server/hls/game123.m3u8

    • 给手机APP提供RTMP流 rtmp://your-server/live/game123

    • 自动录制到 /videos/game123-20230801.flv

  3. 观众通过不同设备同时观看


6. 关键结论

  • Nginx不是推流源,而是流媒体中转站

  • 推流端和播放端都连接Nginx,由它做"交通调度"

  • 这种架构是直播平台的通用方案(类似Twitch/斗鱼的简化版)

如果需要测试,您可以:

  1. 在本地同时运行OBS和VLC

  2. 推流到 rtmp://localhost/live/test

  3. 用VLC播放同一个地址

  4. 此时Nginx就在默默完成流中转工作

 
很好。最后问一下,怎样配置nginx录像
 
 

配置 Nginx RTMP 服务器自动录像

在 Nginx RTMP 模块中配置自动录像功能非常简单,以下是详细的配置方法和相关说明:

基础录像配置

在您的 nginx.conf 文件中的 RTMP 应用部分添加录制指令:

nginx
 
复制
 
下载
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. 分段录制

nginx
 
复制
 
下载
record_interval 30m;  # 每30分钟分段录制
record_max_size 2G;   # 每个文件最大2GB

2. 只录制特定流

nginx
 
复制
 
下载
record notify;  # 仅当收到 on_publish_notify 时开始录制

3. 不同录制格式

nginx
 
复制
 
下载
record_suffix -%Y%m%d%H%M%S.mp4;  # 录制为MP4格式(需要支持)

完整配置示例

nginx
 
复制
 
下载
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;
        }
    }
}

必要操作步骤

  1. 创建录像存储目录:

    bash
     
    复制
     
    下载
    sudo mkdir -p /var/rec
    sudo chown -R www-data:www-data /var/rec  # 确保Nginx有写入权限
  2. 重新加载Nginx配置:

    bash
     
    复制
     
    下载
    sudo nginx -s reload
  3. 测试推流:

    bash
     
    复制
     
    下载
    ffmpeg -re -i test.mp4 -c copy -f flv rtmp://localhost/live/teststream

录像文件处理

录制完成后,您可以通过以下方式处理录像文件:

  1. 自动转码脚本示例 (/usr/local/bin/convert_recording.sh):

    bash
     
    复制
     
    下载
    #!/bin/bash
    INPUT=$1
    BASENAME=$2
    OUTPUT="/var/rec/converted/${BASENAME}.mp4"
    
    ffmpeg -i $INPUT -c:v libx264 -preset fast -c:a aac $OUTPUT
  2. 设置定时清理旧录像:

    bash
     
    复制
     
    下载
    # 每天凌晨清理7天前的录像
    0 0 * * * find /var/rec -type f -mtime +7 -exec rm {} \;

注意事项

  1. 确保磁盘空间充足,录像会占用大量空间

  2. FLV格式兼容性最好,MP4需要分段录制才能播放

  3. 录像会增加服务器CPU和IO负载

  4. 对于生产环境,建议将录像存储在独立磁盘或NAS上

这样配置后,您的Nginx RTMP服务器就会自动录制所有直播内容,并按您设定的规则存储和管理录像文件。

 
还有一个性能问题,发现rtmp延时稍大,有没有替代的方案,还有rtmp有时播放会卡不流传,影响因素是什么,怎样提高。
 
 

RTMP 延迟优化与替代方案

针对您提到的 RTMP 延迟和卡顿问题,我将从优化方案和替代协议两个角度为您分析解决方案。

一、RTMP 延迟优化方案

1. 降低延迟的核心参数调整(Nginx配置)

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推流示例:

bash
 
复制
 
下载
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. 关键指标监控命令

bash
 
复制
 
下载
# 实时查看服务器状态
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超低延迟

nginx
 
复制
 
下载
# SRS服务器配置(替代nginx-rtmp)
listen 1935;  # 兼容RTMP
listen 8000/udp;  # WebRTC端口

# 启动SRS
./objs/srs -c conf/rtc.conf

方案2:SRT协议

bash
 
复制
 
下载
# 推流端
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

nginx
 
复制
 
下载
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/;
}

四、终极优化建议

  1. 硬件加速:

    nginx
     
    复制
     
    下载
    # Nginx支持GPU转码
    exec_push ffmpeg -i rtmp://localhost/live/$name -c:v h264_nvenc ...
  2. 边缘计算架构:

    text
     
    复制
     
    下载
    推流端 → 边缘节点(就近接入) → 中心集群 → CDN分发
  3. 智能码率适配:

    nginx
     
    复制
     
    下载
    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混合架构实现最优效果。

posted @ 2025-07-22 11:07  weipt  阅读(85)  评论(0)    收藏  举报

你的想法很重要-大家都来谈 (C)Copyright 2012 by WeiPt