nginx支持flv伪流需服务端配置、视频文件结构、前端播放三者协同:启用flv模块并正则匹配.flv$路径加flv;指令;flv文件须用yamdi注入metadata;flv.js需设islive:false、accurateseek:true。

要让 Nginx 正确支持 FLV 伪流(即拖拽播放、秒开、精准跳转),不是加个模块就完事,而是服务端配置、视频文件结构、前端播放三者必须协同。核心在于:Nginx 要能按时间点“切”出对应数据,FLV 文件得有索引,播放器得会“问”对的位置。
服务端:启用 flv 模块并配对 location
Nginx 必须编译时包含 ngx_http_flv_module(Ubuntu 的 nginx-full 默认已启用)。关键不是装模块,而是路由必须精准匹配且不被覆盖:
- 用正则匹配 .flv$,避免被 proxy_pass 或 rewrite 拦截
- 在该 location 内直接写 flv; —— 这是开启伪流解析的唯一开关
- 加上 expires 1h; 和 add_header Cache-Control "public";,减少 304 请求,提升拖拽响应速度
示例配置:
location ~ \.flv$ {
flv;
expires 1h;
add_header Cache-Control "public";
}
视频文件:注入 metadata 才能精准寻址
原始转码生成的 FLV 文件通常没有关键帧索引(metadata),导致 ?start=60 实际跳到黑屏或错位。必须用工具预处理:
- 推荐 yamdi:轻量快,命令为 yamdi -i in.flv -o out.flv
- 验证是否成功:运行 ffprobe out.flv,输出中需含 duration 和 metadata 字段
- 不要跳过这步——没 metadata 的 FLV,再好的 Nginx 配置也拖不动
前端播放:flv.js 必须关闭 live 模式
浏览器不原生支持 FLV,必须靠 flv.js 解析。它默认按直播逻辑处理,点播需显式切换:
- isLive: false —— 启用 seek 行为,否则拖拽按钮灰掉
- accurateSeek: true —— 让 flv.js 主动带 ?start=XX 参数发起 Range 请求
- enableStashBuffer: true —— 开启缓冲区,拖动后快速续播不卡顿
- URL 直接写成 video.flv?start=120,初始化时就会从第 120 秒开始加载
额外优化建议
若仍存在首帧慢或卡顿,可叠加以下配置:
- 在 flv location 中加 add_header Accept-Ranges bytes;,显式声明支持分片
- 确保视频编码含 IDR 帧(关键帧),H.264 推荐用 x264 --keyint 250 控制 GOP 长度
- 大文件建议配合 sendfile on; 和 tcp_nopush on; 提升内核级传输效率











