如何配置Nginx-rtmp实现目录下MP4文件连续点播?
Nginx-rtmp 统一端点顺序播放MP4实现方案
核心逻辑
无需使用ffmpeg推流,通过Nginx-rtmp的on_play事件回调结合本地播放队列状态维护,用户访问统一端点时自动按序返回下一个待播放的MP4文件,客户端无感知实现顺序播放。
具体操作步骤
1. 准备播放队列维护脚本
在/opt/video目录下新建play_queue.sh脚本,用于记录播放进度、返回下一个待播放的文件名:
#!/bin/bash # 视频文件存储目录 VIDEO_DIR="/opt/video/vod" # 播放进度持久化文件 PROGRESS_FILE="/opt/video/current_progress.txt" # 初始化进度文件 if [ ! -f "$PROGRESS_FILE" ]; then echo 0 > "$PROGRESS_FILE" fi # 按文件名排序获取所有MP4文件 FILE_LIST=($(ls "$VIDEO_DIR"/*.MP4 2>/dev/null | sort)) TOTAL_FILES=${#FILE_LIST[@]} # 目录无视频直接退出 if [ $TOTAL_FILES -eq 0 ]; then exit 1 fi # 读取当前播放索引 CURRENT_IDX=$(cat "$PROGRESS_FILE") # 索引超过总文件数则重置循环 if [ $CURRENT_IDX -ge $TOTAL_FILES ]; then CURRENT_IDX=0 fi # 输出当前待播放文件名 CURRENT_FILE=$(basename "${FILE_LIST[$CURRENT_IDX]}") echo $CURRENT_FILE # 索引+1写回进度文件 NEXT_IDX=$((CURRENT_IDX + 1)) echo $NEXT_IDX > "$PROGRESS_FILE"
给脚本和目录赋权:
chmod +x /opt/video/play_queue.sh chown nginx:nginx /opt/video/play_queue.sh /opt/video/
2. 修改Nginx配置
更新你的Nginx配置,在原有rtmp块基础上增加回调逻辑,同时新增http块的调度逻辑(如果已有http块仅需新增对应location即可):
rtmp { server { listen 1935; chunk_size 4096; application vod { allow play all; wait_video on; play /opt/video/vod; # 播放请求触发回调动态调度文件 on_play http://localhost/rtmp_play_redirect; } } } http { server { listen 80; server_name localhost; location /rtmp_play_redirect { set $play_path $arg_name; # 匹配统一播放端点stream if ($play_path = "stream") { # 执行脚本获取下一个待播放文件 set_by_lua $next_file ' local handle = io.popen("/opt/video/play_queue.sh") local result = handle:read("*a") handle:close() return string.gsub(result, "%s+", "") '; # 内部重定向到实际视频文件,客户端无感知 return 302 "vod/$next_file"; } } } }
*如果你的Nginx未编译lua模块,可将http回调逻辑替换为php/python等任意已支持的后端脚本,只要实现返回302重定向到实际MP4路径的逻辑即可。
3. 重启Nginx生效
先验证配置正确性:
nginx -t
确认无报错后重启服务:
systemctl restart nginx
效果说明
注:你提问中写的rtsp地址为笔误,nginx-rtmp模块默认对外提供的是rtmp协议流,如果你需要rtsp输出可以额外编译nginx-rtsp模块,上述调度逻辑完全兼容。
直接用播放器访问rtmp://192.168.1.100/vod/stream即可播放第一个视频,播放完成后断开重连该地址会自动播放下一个视频,如需完全无缝自动切流,仅需在播放器侧增加断流自动重连逻辑即可,服务端无需额外修改。
内容的提问来源于stack exchange,提问作者Balazs
相关产品推荐
相关产品推荐

