You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:48:03