从零配置基于Nginx的RTMP/HLS/DASH全场景视频点播协议
时间:2026年06月04日 08:13:53
来源:易频IT社区
一、前置准备
1.1 系统环境
推荐使用 Ubuntu 22.04 LTS 64位 系统,操作前确保已执行系统更新:
```bash
sudo apt update && sudo apt upgrade -y
```
1.2 编译依赖安装
Nginx默认不支持RTMP,需编译模块;HLS/DASH需模块`nginx-http-flv-module`替代基础RTMP(性能更优,支持HLS/DASH自动生成),依赖如下:
```bash
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev git -y
```
1.3 源码下载
固定Nginx 1.25.3(稳定版+兼容HTTP-FLV)和模块源码:
```bash
切换到临时目录
cd /usr/local/src
下载Nginx
wget http://nginx.org/download/nginx-1.25.3.tar.gz
解压Nginx
tar -zxvf nginx-1.25.3.tar.gz
下载nginx-http-flv-module
git clone https://github.com/winshining/nginx-http-flv-module.git
```
二、编译安装Nginx
2.1 配置编译参数
配置模块路径、安装路径、SSL等:
```bash
cd nginx-1.25.3
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=../nginx-http-flv-module
```
2.2 编译并安装
```bash
make -j$(nproc)
sudo make install
```
2.3 配置系统服务
创建服务文件便于管理:
```bash
sudo nano /etc/systemd/system/nginx.service
```
粘贴以下完整内容:
```
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
```
保存退出(Ctrl+O→Enter→Ctrl+X),重载并启动服务:
```bash
sudo systemctl daemon-reload
sudo systemctl start nginx
sudo systemctl enable nginx
```
三、全场景点播协议配置
3.1 核心目录准备
创建点播文件存放目录、HLS/DASH临时转码目录,设置权限:
```bash
sudo mkdir -p /var/www/vod/video /var/www/vod/temp
sudo chown -R www-data:www-data /var/www/vod
```
3.2 完整Nginx配置文件
替换默认配置:
```bash
sudo mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
sudo nano /usr/local/nginx/conf/nginx.conf
```
粘贴以下完整可复制内容:
```
user www-data;
worker_processes auto;
pid /usr/local/nginx/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
点播HTTP端口(按需修改为8080等)
server {
listen 80;
server_name _;
HLS/DASH静态文件目录
location /vod {
alias /var/www/vod/video;
expires 30d;
add_header Cache-Control "public";
跨域配置(用于Web播放,按需修改allowed_origin)
add_header Access-Control-Allow-Origin ;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
if ($request_method = 'OPTIONS') {
return 204;
}
}
RTMP推流记录后自动转HLS/DASH(可选,但点播更推荐直接转静态文件)
这里为了测试方便,保留手动推流转点播的入口
location /vod-live-to-static {
alias /var/www/vod/temp;
expires 1d;
add_header Access-Control-Allow-Origin ;
}
}
}
RTMP协议配置
rtmp {
server {
listen 1935;
chunk_size 4096;
推流记录应用(转静态点播源)
application record {
live on;
开启录制
record all;
录制文件保存路径
record_path /var/www/vod/temp;
录制文件命名规则(带时间戳+流名)
record_unique on;
录制格式为flv
record_format flv;
录制文件自动转HLS(可选,需手动后续合并或转MP4)
hls on;
hls_path /var/www/vod/temp/hls;
hls_fragment 5s;
hls_playlist_length 30s;
推流跨域(可选)
allow play all;
}
点播拉流应用
application vod {
play /var/www/vod/video;
}
}
}
```
保存退出,重载Nginx:
```bash
sudo /usr/local/nginx/sbin/nginx -t
sudo systemctl reload nginx
```
四、点播源文件处理
4.1 上传或准备源文件
将本地MP4/FLV文件上传到`/var/www/vod/video`目录,推荐使用`scp`命令(本地终端执行,替换IP、路径):
```bash
本地Windows/Mac/Linux通用(Mac/Linux无需转义,Windows PowerShell需替换路径分隔符)
scp /本地/文件/路径/test.mp4 root@服务器公网IP:/var/www/vod/video/
```
上传后再次确认权限:
```bash
sudo chown -R www-data:www-data /var/www/vod/video/test.mp4
```
4.2 源文件转HLS/DASH(必做,适配Web)
Nginx HTTP-FLV支持MP4/FLV点播,但HLS/DASH是Web/移动端通用的高兼容协议,需用`ffmpeg`转:
```bash
安装ffmpeg
sudo apt install ffmpeg -y
转HLS(单码率,推荐,兼容性最好)
sudo ffmpeg -i /var/www/vod/video/test.mp4 \
-c:v libx264 -c:a aac \
-hls_time 5 \
-hls_list_size 0 \
-hls_segment_filename /var/www/vod/video/test_%03d.ts \
/var/www/vod/video/test.m3u8
转DASH(单码率,适配Chrome/Edge等现代浏览器,可选但建议)
sudo ffmpeg -i /var/www/vod/video/test.mp4 \
-c:v libx264 -c:a aac \
-f dash \
-seg_duration 5 \
-window_size 0 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
/var/www/vod/video/test.mpd
```
转码后权限再次确认:
```bash
sudo chown -R www-data:www-data /var/www/vod/video/
```
五、播放测试
5.1 RTMP点播测试
使用VLC播放器:
- 打开VLC→媒体→打开网络串流
- 输入地址:`rtmp://服务器公网IP/vod/test.mp4`
- 点击播放即可
5.2 HLS/DASH点播测试
使用在线测试工具(无需本地安装播放器):
- HLS测试:访问https://test-streams.mux.dev/x36xhzz/ ,输入地址`http://服务器公网IP/vod/test.m3u8`
- DASH测试:访问https://reference.dashif.org/dash.js/latest/samples/dash-if-reference-player/index.html ,输入地址`http://服务器公网IP/vod/test.mpd`
5.3 本地Web测试(可选)
新建本地HTML文件`test.html`,粘贴以下内容(支持HLS/DASH自动切换兼容模式):
```html
点播测试
```
用浏览器打开本地`test.html`即可播放。
六、常见问题排查
6.1 Nginx启动失败
- 检查端口占用:`sudo netstat -tulpn | grep -E '80|1935'`,如有占用可修改Nginx配置的`listen`值
- 检查配置语法:`sudo /usr/local/nginx/sbin/nginx -t`
6.2 播放403/404
- 404:确认文件路径与Nginx配置的`alias`/`play`匹配
- 403:确认目录/文件权限为`www-data:www-data`,或临时设为`755`测试:`sudo chmod -R 755 /var/www/vod`
6.3 RTMP点播卡顿
- 调整Nginx配置的`chunk_size`为`8192`或`16384`
- 检查服务器带宽,单码率1080P需至少2Mbps上行/下行带宽