nginx-rtmp-module是一个基于Nginx的RTMP/HLS/MPEG-DASH流媒体服务器模块,可以用来搭建直播平台。以下是实现直播间功能的完整方案:
# 下载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
编辑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/;
}
}
}
主播可以使用OBS、FFmpeg等工具推流:
OBS设置:
FFmpeg命令示例:
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://your-server-ip/live/stream-key
观众可以通过以下方式观看直播:
RTMP协议:
rtmp://your-server-ip/live/stream-key
HLS协议(适合网页播放):
http://your-server-ip/hls/stream-key.m3u8
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;
}
application live {
live on;
record all;
record_path /var/rec;
record_unique on;
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
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;
}
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;
}
?>
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; }
# 其他配置...
}
worker_processes auto;
rtmp_auto_push on;
rtmp {
server {
listen 1935 so_keepalive=on;
# 其他配置...
}
}
rtmp {
server {
buflen 5s;
# 其他配置...
}
}
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
nginx-rtmp-monitoring
或Grafana
进行监控。推流失败:
播放卡顿:
延迟过高:
通过以上配置,你可以搭建一个功能完善的直播平台。根据实际需求,你可以进一步扩展功能,如添加聊天室、礼物系统等,这些通常需要通过额外的应用程序与直播流服务器配合实现。