顺德区上往网

nginx+rtmp实现直播完整流程

2026-03-29 21:59:01 浏览次数:1
详细信息

Nginx + RTMP 实现直播的完整流程

一、系统架构概述

推流端 (OBS/FFmpeg/手机APP)
        ↓
    [RTMP协议]
        ↓
Nginx + RTMP 模块
        ↓
  ┌─────┴─────┐
  ↓           ↓
RTMP播放   HLS播放
(VLC/FFplay) (浏览器)

二、安装与配置

1. 安装依赖

# Ubuntu/Debian
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev

# CentOS/RHEL
sudo yum install gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel

2. 下载源码并编译

# 下载nginx
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz

# 下载nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git

# 编译安装
cd nginx-1.24.0
./configure --add-module=../nginx-rtmp-module \
            --with-http_ssl_module \
            --with-http_v2_module \
            --with-http_flv_module \
            --with-http_mp4_module

make && sudo make install

三、Nginx RTMP配置

完整配置文件 /usr/local/nginx/conf/nginx.conf

worker_processes  auto;
events {
    worker_connections  1024;
}

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 3s;
            hls_playlist_length 60s;

            # DASH配置(可选)
            # dash on;
            # dash_path /tmp/dash;

            # 转码(可选)
            # exec ffmpeg -i rtmp://localhost/live/$name
            #   -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k
            #   -f flv rtmp://localhost/hls/$name_hi
            #   -c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 750k
            #   -f flv rtmp://localhost/hls/$name_low;
        }

        # 支持FLV播放
        application flv {
            live on;
            flv on;
        }
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen       80;
        server_name  localhost;

        # HLS播放地址
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            alias /tmp/hls;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
        }

        # DASH播放地址(可选)
        location /dash {
            alias /tmp/dash;
            add_header Cache-Control no-cache;
        }

        # 状态监控页面
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /path/to/nginx-rtmp-module/;
        }

        # 播放器页面
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

四、启动与测试

1. 启动Nginx

# 启动
sudo /usr/local/nginx/sbin/nginx

# 重启
sudo /usr/local/nginx/sbin/nginx -s reload

# 停止
sudo /usr/local/nginx/sbin/nginx -s stop

2. 推流测试

使用FFmpeg推流:

# 本地文件推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost/live/stream1

# 摄像头推流
ffmpeg -f avfoundation -i "0" -vcodec libx264 -preset ultrafast \
       -acodec libmp3lame -ar 44100 -f flv rtmp://localhost/live/stream1

# 屏幕录制推流
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast \
       -acodec aac -f flv rtmp://localhost/live/stream1

使用OBS推流:

服务器: rtmp://你的服务器IP/live
串流密钥: stream1 (自定义)

3. 播放测试

RTMP播放:

# VLC播放
vlc rtmp://localhost/live/stream1

# FFplay播放
ffplay rtmp://localhost/live/stream1

HLS播放:

# VLC播放HLS
vlc http://localhost/hls/stream1.m3u8

# 浏览器播放
http://localhost/hls/stream1.m3u8

FLV播放:

ffplay http://localhost/flv?app=live&stream=stream1

五、网页播放器示例

创建 html/player.html

<!DOCTYPE html>
<html>
<head>
    <title>直播播放器</title>
    <link href="https://vjs.zencdn.net/7.20.3/video-js.css" rel="stylesheet">
</head>
<body>
    <h2>RTMP直播流</h2>
    <video id="rtmp-player" class="video-js vjs-default-skin" controls preload="auto" width="640" height="360">
        <source src="rtmp://localhost/live/stream1" type="rtmp/mp4">
    </video>

    <h2>HLS直播流</h2>
    <video id="hls-player" class="video-js vjs-default-skin" controls preload="auto" width="640" height="360">
        <source src="http://localhost/hls/stream1.m3u8" type="application/x-mpegURL">
    </video>

    <script src="https://vjs.zencdn.net/7.20.3/video.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/videojs-flash@2.2.1/dist/videojs-flash.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/videojs-contrib-hls@5.15.0/dist/videojs-contrib-hls.min.js"></script>

    <script>
        // RTMP播放器(需要Flash)
        videojs('rtmp-player', {
            techOrder: ['flash', 'html5']
        });

        // HLS播放器
        var player = videojs('hls-player');
    </script>
</body>
</html>

六、高级配置

1. 多码率自适应流

application live {
    live on;

    # 原始流
    exec ffmpeg -i rtmp://localhost/live/$name
        # 高清
        -c:v libx264 -b:v 2000k -c:a aac -b:a 128k
        -vf scale=1280:720 -f flv rtmp://localhost/live/$name_720p
        # 标清
        -c:v libx264 -b:v 1000k -c:a aac -b:a 96k
        -vf scale=854:480 -f flv rtmp://localhost/live/$name_480p
        # 流畅
        -c:v libx264 -b:v 500k -c:a aac -b:a 64k
        -vf scale=640:360 -f flv rtmp://localhost/live/$name_360p;
}

2. 安全配置

application live {
    live on;

    # 推流鉴权
    on_publish http://localhost/auth_publish;
    on_play http://localhost/auth_play;

    # 允许/拒绝IP
    allow publish 192.168.1.0/24;
    deny publish all;
    allow play all;

    # 推流密钥验证
    # 推流地址: rtmp://server/live/stream?key=secret
}

3. 录制配置

application live {
    live on;

    # 录制所有流
    record all;
    record_path /var/rec;
    record_unique on;
    record_suffix -%Y-%m-%d-%H_%M_%S.flv;

    # 或按需录制
    record off;
    record_notify on;
    on_record_done http://localhost/record_done;
}

七、监控与调试

查看状态页面

访问:http://你的服务器IP/stat

日志查看

# 查看错误日志
tail -f /usr/local/nginx/logs/error.log

# 查看访问日志
tail -f /usr/local/nginx/logs/access.log

八、常见问题解决

端口被占用

netstat -tlnp | grep 1935
sudo kill -9 <PID>

防火墙配置

# 开放端口
sudo ufw allow 1935/tcp  # RTMP
sudo ufw allow 80/tcp     # HTTP/HLS
sudo ufw allow 443/tcp    # HTTPS

权限问题

sudo chmod 755 /tmp/hls
sudo chown www-data:www-data /tmp/hls

九、生产环境建议

使用Docker部署

docker run -d -p 1935:1935 -p 80:80 \
  -v /path/to/hls:/tmp/hls \
  tiangolo/nginx-rtmp

配置HTTPS

使用CDN加速

负载均衡

这个完整流程涵盖了从安装配置到生产部署的所有环节。根据实际需求调整配置参数即可。

相关推荐