nginx怎么使用nginx-rtmp-module模块实现直播间功能

摘自:https://chajianwo.com/blog-32977.html

使用nginx-rtmp-module实现直播间功能指南

nginx-rtmp-module是一个基于Nginx的RTMP/HLS/MPEG-DASH流媒体服务器模块,可以用来搭建直播平台。以下是实现直播间功能的完整方案:

1. 安装与配置

1.1 安装nginx-rtmp-module

复制代码
# 下载Nginx和rtmp模块
wget http://nginx.org/download/nginx-1.xx.x.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.x.tar.gz

# 解压
tar -zxvf nginx-1.xx.x.tar.gz
tar -zxvf v1.2.x.tar.gz

# 编译安装
cd nginx-1.xx.x
./configure --add-module=../nginx-rtmp-module-1.2.x
make
sudo make install

1.2 基本配置

编辑Nginx配置文件(通常位于/usr/local/nginx/conf/nginx.conf):

复制代码
rtmp {
    server {
        listen 1935;  # RTMP默认端口
        chunk_size 4096;

        application live {
            live on;
            record off;

            # HLS配置
            hls on;
            hls_path /tmp/hls;
            hls_fragment 3s;
            hls_playlist_length 60s;

            # 访问控制
            allow publish 192.168.1.0/24;  # 允许发布的IP范围
            deny publish all;

            # 推流鉴权
            on_publish http://yourdomain.com/auth;
        }

        # 可以配置多个application对应不同直播间
        application room1 {
            live on;
            # 其他配置...
        }
    }
}

http {
    server {
        listen 80;

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            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/;
        }
    }
}

2. 实现直播间功能

2.1 推流端配置

主播可以使用OBS、FFmpeg等工具推流:

  • OBS设置:

    • 服务器: rtmp://your-server-ip/live
    • 流密钥: stream-key (可自定义)
  • FFmpeg命令示例:

    ffmpeg -re -i input.mp4 -c copy -f flv rtmp://your-server-ip/live/stream-key

2.2 拉流播放

观众可以通过以下方式观看直播:

  1. RTMP协议:

    复制代码
    rtmp://your-server-ip/live/stream-key
  2. HLS协议(适合网页播放):

    复制代码
    http://your-server-ip/hls/stream-key.m3u8

2.3 高级功能实现

2.3.1 多房间/频道支持
复制代码
application live {
    live on;

    # 使用$name变量区分不同房间
    exec ffmpeg -i rtmp://localhost/live/$name
              -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k -f flv -g 30 -r 30 -s 1280x720 -preset superfast -profile:v baseline rtmp://localhost/hls/$name_720
              -c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 1000k -f flv -g 30 -r 30 -s 854x480 -preset superfast -profile:v baseline rtmp://localhost/hls/$name_480;
}
2.3.2 录制直播
复制代码
application live {
    live on;
    record all;
    record_path /var/rec;
    record_unique on;
    record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
2.3.3 转码与多码率
复制代码
application live {
    live on;

    exec ffmpeg -i rtmp://localhost/live/$name
              -c:a aac -b:a 32k -c:v libx264 -b:v 128K -f flv rtmp://localhost/live/${name}_low
              -c:a aac -b:a 64k -c:v libx264 -b:v 256k -f flv rtmp://localhost/live/${name}_mid
              -c:a aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost/live/${name}_high;
}

3. 安全与鉴权

3.1 推流鉴权

复制代码
on_publish http://yourdomain.com/auth;

然后创建一个简单的鉴权服务(例如PHP):

复制代码
<?php
// 验证stream_key是否有效
$valid_keys = ["room1_key", "room2_key"];
$stream_key = $_GET['name'];

if(in_array($stream_key, $valid_keys)) {
    header("HTTP/1.1 200 OK");
    exit;
} else {
    header("HTTP/1.1 403 Forbidden");
    exit;
}
?>

3.2 播放鉴权

复制代码
location /hls {
    # 添加token验证
    secure_link $arg_token,$arg_expires;
    secure_link_md5 "$secure_link_expires$uri your_secret";

    if ($secure_link = "") { return 403; }
    if ($secure_link = "0") { return 410; }

    # 其他配置...
}

4. 性能优化

  1. 启用多worker

    worker_processes auto;
    rtmp_auto_push on;

  2. TCP优化

    rtmp {
    server {
    listen 1935 so_keepalive=on;
    # 其他配置...
    }
    }

  3. 缓冲区优化

    rtmp {
    server {
    buflen 5s;
    # 其他配置...
    }
    }

5. 监控与管理

  1. 使用内置统计页面:

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

  2. 使用第三方工具如nginx-rtmp-monitoringGrafana进行监控。

6. 常见问题解决

  1. 推流失败

    • 检查防火墙是否开放1935端口
    • 检查nginx-rtmp-module是否正确加载
    • 检查推流地址和密钥是否正确
  2. 播放卡顿

    • 调整HLS片段大小和数量
    • 检查服务器带宽是否充足
    • 考虑启用多码率适配
  3. 延迟过高

    • 减少HLS片段长度
    • 禁用播放器缓冲
    • 考虑使用低延迟配置

通过以上配置,你可以搭建一个功能完善的直播平台。根据实际需求,你可以进一步扩展功能,如添加聊天室、礼物系统等,这些通常需要通过额外的应用程序与直播流服务器配合实现。

相关推荐
christine-rr3 分钟前
征文投稿:如何写一份实用的技术文档?——以软件配置为例
运维·前端·网络·数据库·软件构建
眠修10 分钟前
Nginx + Tomcat负载均衡群集
nginx·tomcat·负载均衡
Altairr29 分钟前
Docker基础(二)
运维·docker·容器
笑醉踏歌行41 分钟前
NVM,Node.Js 管理工具
运维·ubuntu·node.js
西北大程序猿1 小时前
单例模式与锁(死锁)
linux·开发语言·c++·单例模式
酷爱码1 小时前
在 Linux 中修改 Apache HTTP Server(httpd)默认端口的完整指南
linux·http·apache
happyh h h h p p p p1 小时前
部署DNS从服务器
运维·服务器·网络
jiunian_cn1 小时前
【Linux】Linux权限
linux·服务器·mysql
betazhou2 小时前
有没有 MariaDB 5.5.56 对应 MySQL CONNECTION_CONTROL 插件
linux·数据库·mysql·oracle·mariadb
烟雨书信2 小时前
Linux中MySQL的逻辑备份与恢复
linux·运维·mysql