HLS 推流服务器(Nginx + RTMP 模块)总结
1. Nginx 配置(nginx.conf
)
worker_processes auto;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application tv { # 推流应用名
live on;
hls on;
hls_path /opt/hls/live; # HLS 切片存储位置
hls_fragment 3s; # 每个TS切片时长
hls_playlist_length 60s; # HLS播放列表长度
hls_nested off; # 禁用嵌套目录结构
record off; # 禁止录制
}
}
}
http {
server {
listen 8080;
location / {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /opt/hls/live;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
rewrite ^/tv\.m3u8$ /index.m3u8 break; # 简化访问URL
}
}
}
关键点:
- RTMP 监听
1935
端口(用于接收推流) - HTTP 监听
8080
端口(用于HLS播放) - HLS 切片存储在
/opt/hls/live
- 访问
http://IP:8080/tv.m3u8
可直接播放
2. 推流方法(使用 FFmpeg)
ffmpeg -re -i input.mp4 \
-c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 128k \
-f flv "rtmp://SERVER_IP/tv/STREAM_KEY"
参数说明:
-re
:按输入文件的原速度推流(避免过快)-c:v libx264
:视频编码为 H.264-c:a aac
:音频编码为 AAC-f flv
:输出格式为 FLV(RTMP 标准格式)rtmp://SERVER_IP/tv/STREAM_KEY
:SERVER_IP
:Nginx 服务器 IPtv
:Nginx 配置中的application
名称STREAM_KEY
:自定义流名称(如test
)
示例:
ffmpeg -re -i movie.mp4 -c:v libx264 -c:a aac -f flv rtmp://192.168.1.100/tv/livestream
3. 接收/播放 HLS 流
播放地址:
http://SERVER_IP:8080/tv.m3u8
支持的播放方式:
- 浏览器(支持 HLS 的播放器,如 hls.js)
- VLC / FFplay:
ffplay http://192.168.1.100:8080/tv.m3u8
- 手机/平板(iOS/Android 的 HLS 兼容播放器)
4. 常见问题排查
问题 | 检查方法 |
---|---|
推流失败 | ffprobe rtmp://SERVER_IP/tv/STREAM_KEY 是否卡住? |
HLS 无输出 | ls /opt/hls/live/ 是否有 .ts 和 .m3u8 文件? |
Nginx 未启动 | ps aux | grep nginx 检查进程 |
端口未开放 | netstat -tulnp | grep 1935 或 curl http://localhost:8080/stat |
最终流程总结
- 启动 Nginx RTMP 服务器(Docker 或直接运行)
- 推流:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f flv rtmp://IP/tv/stream1
- 播放:
- 浏览器打开
http://IP:8080/tv.m3u8
- 或
ffplay http://IP:8080/tv.m3u8
这样,您就搭建了一个完整的 HLS 直播推流服务器! 🚀
RTMP 推流 和 HLS 播放 的关系,这里做一个清晰的解释:
1. RTMP 推流路径 vs. HLS 播放路径
tv
:对应 Nginx 配置中的application
名称(必须一致)livestream
:自定义的流名称(可任意修改,如test123
)hls_nested off
+rewrite
规则,无论推流时的流名称是什么,HLS 播放地址始终是固定的tv.m3u8
。2. 为什么
livestream
不影响 HLS 播放?在您的 Nginx 配置中,关键设置如下:
hls_nested off
:HLS 切片会直接生成在/opt/hls/live/
下,文件名为index.m3u8
和xxx.ts
(而不是/livestream/index.m3u8
)。rewrite
规则:将用户请求的tv.m3u8
重定向到实际的index.m3u8
。因此,无论推流时用的是
rtmp://.../tv/livestream
还是rtmp://.../tv/abc123
,最终 HLS 访问地址都是http://IP:8080/tv.m3u8
。3. 如果需要流名称关联(动态 HLS 地址)
如果希望播放地址与流名称关联(如
http://IP:8080/livestream.m3u8
),需修改配置:此时:
rtmp://IP/tv/livestream
http://IP:8080/hls/livestream/index.m3u8
4. 总结
场景
推流地址
播放地址
必要条件
固定 HLS 地址
rtmp://IP/tv/任意名称
http://IP:8080/tv.m3u8
hls_nested off
+rewrite
规则动态 HLS 地址
rtmp://IP/tv/livestream
http://IP:8080/hls/livestream/index.m3u8
hls_nested on
当前配置属于 固定 HLS 地址 方案,因此
livestream
不会影响播放地址。如果需要动态关联流名称,需调整配置。