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片段长度
    • 禁用播放器缓冲
    • 考虑使用低延迟配置

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

相关推荐
comedate1 天前
Windows / Linux GPU 虚拟内存布局差异与 CUDA 越界访问行为
linux·windows·mmu·cuda 越界访问
东风破_1 天前
Docker 基础:为什么需要容器?
前端·后端·nginx
东风破_1 天前
Docker 实战:使用 Nginx 作为容器入口代理 Node 服务
前端·后端·nginx
暴力求解1 天前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
JoyCong19981 天前
ToDesk个人版、专业版、游戏版、设计版、性能版、团队版权益介绍
大数据·运维·游戏·远程工作·远程操作
ltl1 天前
序列化格式深度对比:Protobuf、FlatBuffers、Cap’n Proto
linux
lengjingzju1 天前
编译与调试完全指南—第17章 总结
linux
ltl1 天前
容器网络性能真相:veth vs macvlan vs eBPF 数据面
linux
Elastic 中国社区官方博客1 天前
ES95:面向 Elasticsearch 时间序列指标的自适应压缩
大数据·运维·elasticsearch·搜索引擎·架构·全文检索
我不会插花弄玉1 天前
9.进程间通信(上)【由浅入深-Linux】
linux·共享内存·进程通信