要让FLV或MP4在Nginx下支持边下边播,需启用对应模块(mp4/flv)、配置location并优化视频结构:MP4需moov前置,FLV需metadata,且均须合理设置关键帧间隔。

要让 FLV 或 MP4 视频在 Nginx 下真正支持边下边播(即“渐进式加载”),光靠基础静态服务远远不够。核心在于两点:一是服务端能按需返回视频片段(尤其是关键帧起始位置),二是视频文件自身结构必须适配流式读取。下面从 Nginx location 配置切入,讲清楚关键设置和配套动作。
启用 Nginx 内置模块支持
Nginx 默认不开启对视频流的智能分片响应能力,需编译时或运行时确认已加载对应模块:
-
MP4 支持:必须启用
--with-http_mp4_module,并在location中显式调用mp4; -
FLV 支持:需启用
--with-http_flv_module,并配置flv;指令 - 若使用较老版本 Nginx(如 1.1.3 以前),可能还需第三方模块
nginx_mod_h264_streaming,但现代稳定版已无需
标准 location 配置示例
以下是最小可用且安全的配置,放在 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 Cache-Control "public, max-age=31536000";
}
说明:
-
mp4_buffer_size控制解析 moov 头部的内存缓冲,太小会报错;mp4_max_buffer_size限制最大可读元数据尺寸(尤其对大 moov 的 4K 视频) -
add_header Accept-Ranges bytes是客户端判断能否拖拽/边播的关键响应头,不可省略 - 正则匹配建议用
\.mp4$而非*.mp4,避免路径遍历风险
配套视频文件结构优化
即使 Nginx 配置正确,如果视频文件本身不满足流式要求,依然会卡在加载阶段:
-
MP4 文件:moov box 必须位于文件开头(称为 “faststart”)。可用
qt-faststart或 FFmpeg 重排:ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4 -
FLV 文件:必须包含 metadata(含关键帧索引、时长、分辨率等)。缺失时用
yamdi补全:yamdi -i input.flv -o output.flv - 两者都应有合理关键帧间隔(如 H.264 设置
-g 30或keyint=30),过长会导致拖拽延迟明显
验证是否生效
配置后别急着上线,三步快速验证:
- 用
curl -I http://your.site/video.mp4查看响应头中是否有Accept-Ranges: bytes - 在浏览器开发者工具 Network 标签中播放视频,观察请求是否出现
Range: bytes=0-xxx分段请求 - 尝试拖动进度条,看是否立刻跳转(而非等待缓冲圈转完);也可用 VLC 打开 URL,测试 seek 行为

















