linux下搭建RTMP视频点播、直播、HLS服务器
一、环境准备
1. 服务器要求
- 操作系统:Ubuntu/CentOS/Debian(推荐 Ubuntu 22.04 LTS)
- 硬件配置:4GB 内存 + 2 核 CPU(HLS 转码需更高配置)
- 依赖库:
gcc
、make
、pcre
、zlib
、openssl
2. 安装 Nginx + RTMP 模块
# 下载 Nginx 和 RTMP 模块源码
wget http://nginx.org/download/nginx-1.25.3.tar.gz
git clone https://github.com/arut/nginx-rtmp-module
# 编译安装
tar -zxvf nginx-1.25.3.tar.gz
cd nginx-1.25.3
./configure --add-module=./nginx-rtmp-module --with-http_ssl_module
make && sudo make install
3. 安装 FFmpeg
sudo apt-get install ffmpeg # Ubuntu/Debian
# 或手动编译安装最新版(支持 H.265 硬编解码)
二、Nginx 配置
1. 基础 RTMP 配置
编辑 /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 文件存储路径
hls_fragment 5s; # 每个 TS 文件时长
hls_playlist_length 60s; # 播放列表长度
}
# 点播应用
application vod {
play /opt/video/vod; # 点播文件目录
}
}
}
http {
server {
listen 80;
server_name localhost;
# HLS 访问配置
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 *; # 跨域支持
}
# RTMP 状态监控
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /usr/local/nginx/nginx-rtmp-module;
}
}
}
2. 启用 HTTP-FLV 支持(可选)
安装 nginx-http-flv-module
:
git clone https://github.com/winshining/nginx-http-flv-module
./configure --add-module=./nginx-http-flv-module --add-module=./nginx-rtmp-module
make && sudo make install
配置 /etc/nginx/conf.d/flv.conf
:
location /live {
flv;
root /tmp/hls;
add_header Access-Control-Allow-Origin *;
}
三、功能实现
1. RTMP 直播推流与播放
- 推流地址:
rtmp://服务器IP/live/stream_key
- 播放地址:
- RTMP:
rtmp://服务器IP/live/stream_key
- HLS:
http://服务器IP/hls/stream_key.m3u8
- RTMP:
2. 视频点播
- 将视频文件(windows用 scp -r "本地文件路径" 用户名@服务器IP:/目标路径 如
test.mp4
)放入/opt/video/vod
目录。 - 播放地址:
rtmp://服务器IP/vod/test.mp4
3. HLS 实时切片
- FFmpeg 自动将 RTMP 流切片为 HLS 格式:
ffmpeg -re -i input.mp4 -c:v copy -c:a copy -f flv rtmp://服务器IP/live/stream
四、优化与安全
1. 性能优化
- 启用硬件加速(NVIDIA GPU):
rtmp { application live { # 启用 GPU 编码 exec ffmpeg -hwaccel cuvid -i rtmp://localhost/live/$name -c:v h264_nvenc -preset fast -b:v 2500k -c:a aac -b:a 128k -f flv rtmp://localhost/hls/$name_720p; } }
- 调整缓冲区:
rtmp { chunk_size 8192; # 增大块大小以减少延迟 }
2. 安全加固
- 访问控制:
location /hls { allow 192.168.1.0/24; # 允许内网访问 deny all; # 拒绝其他 IP }
- HTTPS 配置:
server { listen 443 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; }
五、测试与验证
1. 推流测试
使用 OBS 推流:
- 推流地址:
rtmp://服务器IP/live/stream
- 流密钥:
test
2. 播放测试
- HLS 播放:浏览器访问
http://服务器IP/hls/stream.m3u8
- RTMP 播放:VLC 播放器输入
rtmp://服务器IP/live/stream
3. 日志监控
- RTMP 状态页:
http://服务器IP/stat
- 错误日志:
/usr/local/nginx/logs/error.log
六、常见问题解决
问题 | 解决方案 |
---|---|
推流失败(Error 403) | 检查 hls_path 目录权限:chmod 777 /tmp/hls |
HLS 无法播放 | 确认 FFmpeg 是否生成 .m3u8 和 .ts 文件,检查防火墙是否开放 80/1935 端口 |
延迟过高 | 减小 hls_fragment (如 3s),启用低延迟模式:-preset ultrafast |
Nginx 启动报错 | 检查配置语法:nginx -t ,重新编译时确保依赖库版本兼容 |
七、扩展应用
- 多平台级联:通过
push
指令将流推送到其他服务器(如 YouTube/抖音):application live { live on; push rtmp://youtube/stream_key; }
- 动态码率自适应:结合 FFmpeg 生成多分辨率 HLS 流:
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -b:v 2500k -vf scale=854:480 -c:v libx264 -b:v 1000k -f flv rtmp://服务器IP/live/stream_720p
通过以上配置,可搭建一个高性能的流媒体服务器,支持低延迟直播、点播回放及多终端自适应播放。如需进一步优化,可参考 Nginx 官方文档及 FFmpeg 高级参数调优。
出现问题:记得私信与我交流