要让FLV或MP4在Nginx上支持边下边播,需同时满足:1. Nginx启用对应模块并正确配置location(mp4需--with-http_mp4_module+mp4;指令,flv需--with-http_flv_module+flv;指令);2. 视频文件结构适配流式读取(MP4需faststart、FLV需metadata、关键帧间隔建议2秒);3. 验证Range请求返回206、拖拽响应即时、响应头含Accept-Ranges: bytes。

要让 FLV 或 MP4 在 Nginx 上真正支持边下边播(即“渐进式加载”或“伪流”),光靠静态文件服务远远不够。核心在于两件事:Nginx 能按请求范围(Range)精准返回视频片段,且视频文件自身结构适配流式读取。配置 location 块是其中最关键的一步。
启用对应模块并写对 location 规则
Nginx 默认不开启智能分片响应能力,必须确认已编译并启用对应模块: - MP4 支持需含 `--with-http_mp4_module`,并在 location 中显式调用 `mp4;` - FLV 支持需含 `--with-http_flv_module`,并在 location 中显式调用 `flv;`
标准配置示例如下(放在 server 块内):
location ~ \.mp4$ {
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
add_header Accept-Ranges bytes;
add_header Cache-Control "public, max-age=31536000";
}
location ~ \.flv$ {
flv;
add_header Accept-Ranges bytes;
add_header Content-Type "video/x-flv";
add_header Cache-Control "public, no-transform";
}
说明:
- 正则匹配用
\.mp4$而非*.mp4,避免路径遍历风险 -
mp4_buffer_size控制解析 moov 头的内存缓冲,太小会报错;mp4_max_buffer_size防止大 moov(如 4K 视频)溢出 -
Accept-Ranges: bytes是浏览器判断能否拖拽的关键响应头,不可省略
视频文件结构必须提前优化
即使 Nginx 配置正确,若文件本身不满足流式要求,依然无法秒开或拖拽:
- MP4 文件:moov box 必须位于文件开头(faststart)。可用 FFmpeg 重排:
`ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4`
- FLV 文件:必须含 metadata(关键帧索引、时长、分辨率等)。缺失时用 yamdi 补全:
`yamdi -i input.flv -o output.flv`
- 关键帧间隔建议设为 2 秒左右(如 H.264 的 `-g 30` 或 `keyint=30`),过长会导致拖动后等待明显
验证是否生效的三个动作
配置完成后,别直接上线,快速验证三步走: - 用 curl 发送 Range 请求,检查返回状态码是否为 `206 Partial Content` - 在浏览器中打开视频链接,尝试拖动进度条,观察是否即时响应、无卡顿 - 查看浏览器开发者工具 Network 标签页,确认响应头含 `Accept-Ranges: bytes`,且每次拖动都触发新请求而非整文件重载
不复杂但容易忽略










