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/livestreamhttp://IP:8080/hls/livestream/index.m3u84. 总结
场景
推流地址
播放地址
必要条件
固定 HLS 地址
rtmp://IP/tv/任意名称http://IP:8080/tv.m3u8hls_nested off+rewrite规则动态 HLS 地址
rtmp://IP/tv/livestreamhttp://IP:8080/hls/livestream/index.m3u8hls_nested on当前配置属于 固定 HLS 地址 方案,因此
livestream不会影响播放地址。如果需要动态关联流名称,需调整配置。