Nginx-RTMP-Module 是一个基于 Nginx 的流媒体服务器模块,支持 RTMP、HLS、DASH 等多种流媒体协议。本指南将详细介绍如何从零开始构建一个功能完整的流媒体直播服务器。
Ubuntu/Debian:
sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev
CentOS/RHEL:
sudo yum install -y gcc make pcre pcre-devel openssl openssl-devel zlib zlib-devel
wget https://nginx.org/download/nginx-1.23.3.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/refs/heads/master.zip
unzip master.zip
tar -zxvf nginx-1.23.3.tar.gz
cd nginx-1.23.3
./configure --add-module=../nginx-rtmp-module-master \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_flv_module \
--with-http_mp4_module
make
sudo make install
编辑 /usr/local/nginx/conf/nginx.conf
,添加 RTMP 配置:
rtmp {
server {
listen 1935;
chunk_size 4096;
allow publish 127.0.0.1;
deny publish all;
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;
dash_fragment 3s;
dash_playlist_length 60s;
}
# 录制配置
application record {
live on;
record all;
record_path /var/rec;
record_unique on;
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
}
}
http {
server {
listen 80;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
location /dash {
root /tmp;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
# 状态监控页面
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /path/to/nginx-rtmp-module-master/stat.xsl;
}
}
}
创建认证脚本 /usr/local/nginx/html/auth
(Python 示例):
#!/usr/bin/env python
import sys
import json
# 验证逻辑
def authenticate(name, key):
# 这里替换为你的验证逻辑
valid_keys = {
"stream1": "password1",
"stream2": "password2"
}
return valid_keys.get(name) == key
# 读取输入
data = sys.stdin.read()
params = dict(p.split('=') for p in data.split('&'))
# 验证
if authenticate(params.get('name'), params.get('key')):
print("HTTP/1.1 200 OK\r\n\r\n")
else:
print("HTTP/1.1 401 Unauthorized\r\n\r\n")
sudo /usr/local/nginx/sbin/nginx
使用 OBS 或 FFmpeg 推流:
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmp://your-server-ip/live/stream-key
rtmp://your-server-ip/live/stream-key
http://your-server-ip/hls/stream-key.m3u8
http://your-server-ip/dash/stream-key.mpd
application live {
live on;
exec_push ffmpeg -i rtmp://localhost/live/$name
-c:v libx264 -preset veryfast -s 1280x720 -b:v 2500k -maxrate 2500k -bufsize 5000k -g 50 -f flv rtmp://localhost/hls/$name_720
-c:v libx264 -preset veryfast -s 854x480 -b:v 1000k -maxrate 1000k -bufsize 2000k -g 50 -f flv rtmp://localhost/hls/$name_480
-c:v libx264 -preset veryfast -s 640x360 -b:v 750k -maxrate 750k -bufsize 1500k -g 50 -f flv rtmp://localhost/hls/$name_360;
hls on;
hls_path /tmp/hls;
hls_nested on;
hls_variant _720 BANDWIDTH=3000000,RESOLUTION=1280x720;
hls_variant _480 BANDWIDTH=1500000,RESOLUTION=854x480;
hls_variant _360 BANDWIDTH=1000000,RESOLUTION=640x360;
}
rtmp {
upstream live {
server 192.168.1.10:1935;
server 192.168.1.11:1935;
server 192.168.1.12:1935;
}
server {
listen 1935;
application live {
live on;
proxy_pass live;
}
}
}
访问 http://your-server-ip/stat
查看实时状态
Nginx 日志位于 /usr/local/nginx/logs/
# 每天清理7天前的HLS文件
0 3 * * * find /tmp/hls -type f -mtime +7 -exec rm -f {} \;
Q: 推流成功但无法播放 - 检查防火墙是否开放1935(RTMP)和80/443(HTTP)端口 - 检查HLS/DASH路径权限
Q: 高延迟问题
- 调整HLS片段大小(hls_fragment
)
- 使用低延迟配置:
nginx
hls_sync 100ms;
hls_continuous on;
hls_base_url http://your-cdn.com/;
Q: 音视频不同步
- 确保推流时使用正确的帧率
- 检查编码参数,特别是关键帧间隔(-g
参数)
Q: 服务器负载过高 - 启用硬件加速 - 限制并发连接数 - 考虑使用CDN分发
通过本指南,您应该能够成功搭建一个功能完善的流媒体直播服务器。根据实际需求调整配置,并定期维护以确保服务稳定性。