Nginx需编译启用http_mp4_module或http_flv_module模块并正确配置location规则,配合格式合规的MP4/FLV文件(FLV须经yamdi预处理注入metadata),才能实现边下边播与进度条拖拽;验证时应观察Network中206响应。

Nginx本身不自带MP4/FLV流式播放能力,必须通过编译时启用对应模块,并在配置文件中正确声明位置规则,才能实现边下边播、进度条拖拽等核心功能。关键不在“安装模块”本身,而在于模块是否被编译进Nginx、路径是否匹配、视频文件是否满足格式要求。
确认Nginx已内置必要模块
运行命令查看当前Nginx支持的模块:
/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o "with-http_flv_module\|with-http_mp4_module\|with-http_h264_streaming"
若无输出,说明未编译进对应模块,需重新编译。常见组合如下:
-
--with-http_flv_module:原生支持FLV流式传输(含拖拽),但要求FLV文件含合法metadata(关键帧信息) -
--with-http_mp4_module:原生支持MP4流式传输(H.264/AAC封装),无需额外工具处理,兼容性好 -
--add-module=../nginx_mod_h264_streaming-2.2.7:第三方模块,增强MP4分片与seek能力(旧版常用,新版Nginx 1.10+建议优先用原生mp4模块)
配置location规则启用流式服务
在nginx.conf的server块内添加:
location ~ \.mp4$ {
root /data/videos;
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
}
location ~ \.flv$ {
root /data/videos;
flv;
}
注意点:
-
root路径必须精确指向视频文件所在目录(如/data/videos/demo.mp4,则root设为/data/videos) -
mp4指令会自动识别start参数(如?start=120跳转到第120秒),无需额外rewrite -
flv指令依赖FLV文件头部含metadata;若拖拽失效,大概率是FLV缺少关键帧信息
FLV文件必须预处理添加metadata
原生flv模块无法动态解析时间戳,必须提前注入关键帧索引。推荐使用yamdi:
yamdi -i input.flv -o output.flv
常见问题:
-
yamdi: command not found→ 需先编译安装:make && sudo make install(源码包含Makefile) - 处理后仍无法拖拽 → 用
ffprobe input.flv检查是否有"metadata": { "hasKeyframes": true }字段 - 替代方案:
ffmpeg -i input.flv -c copy -f flv -y output.flv不保证写入metadata,不推荐
验证是否生效
- 直接浏览器访问
http://your-server/demo.mp4,播放后尝试拖动进度条 - 打开开发者工具→Network标签,点击拖拽后应看到多个
206 Partial Content响应,而非单个200 OK - 若返回
404或直接下载文件,检查root路径、文件权限(Nginx worker进程需有读取权限)、SELinux是否拦截(CentOS上可临时setenforce 0测试)











