尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Nginx HTTP-FLV 模块完整指南:安装、配置与验证一步到位

Nginx HTTP-FLV 模块完整指南:安装、配置与验证一步到位 Nginx HTTP-FLV 模块完整指南安装、配置与验证一步到位【免费下载链接】nginx-http-flv-moduleA media streaming server based on nginx-rtmp-module. In addtion to the features nginx-rtmp-module provides, HTTP-FLV, GOP cache, VHosts (one IP for multi domain names) and JSON style statistics are supported now.项目地址: https://gitcode.com/gh_mirrors/ng/nginx-http-flv-modulenginx-http-flv-module 是在 nginx-rtmp-module 基础上扩展出的流媒体服务模块它在继承 RTMP 全部能力的同时新增了 HTTP-FLV 播放、GOP 缓存、单 IP 多域名 VHost 以及 JSON 风格统计等功能。本文将从零带你完成模块编译、Nginx 配置编写与全链路验证目标是让你在一个小时内跑通自己的低延迟直播。先搞清楚一件事HTTP-FLV 到底解决了什么痛点传统 RTMP 直播方案有几个绕不开的麻烦播放端依赖 Flash 插件而 Flash 早在 2020 年底就被 Adobe 停止了官方支持移动端浏览器对 RTMP 更是基本不兼容。HTTP-FLV 的出现就是为了绕过这些限制——它把 FLV 流直接封装在 HTTP 协议里传输浏览器只需要借助 flv.js 这类支持 MSEMedia Source Extensions的播放器就能直接看无需任何插件延迟依然能保持在秒级以内。nginx-http-flv-module 正是冲着这个场景去的以 RTMP 收流以 HTTP-FLV 分发一套 Nginx 同时搞定推流和拉流。特性速览除了 HTTP-FLV它还能给你什么这个模块并非只做了协议转换这一件事对照原版 nginx-rtmp-module它的增强点集中在下面几块HTTP-FLV 播放支持 HTTPS-FLV 和 chunked 分块响应播放端选择更多GOP 缓存新观众加入时不必干等关键帧首屏画面秒出虚拟主机VHost一台机器一个 IP 可以挂多个域名各自独立配置应用JSON 风格统计rtmp_stat 可以直接输出 JSON 格式方便程序对接HLS 单轨支持纯音频或单视频轨也能正常切片reuseport支持多进程模式下缓解惊群问题。平台方面Linux 是推荐运行环境FreeBSD、macOS 也可用Windows 属于受限支持。第一步把模块编译进 Nginx准备源码与依赖编译前先准备两样东西Nginx 源码和本模块源码。模块本身不提供可执行文件它必须作为插件打进 Nginx 里才有意义所以安装模块实际就是重新编译 Nginx。获取模块源码git clone https://gitcode.com/gh_mirrors/ng/nginx-http-flv-module另外确保系统里有 GNU make、GCCLinux 下编译用、以及 Nginx 可能依赖的 PCRE、OpenSSL、zlib 等库。Nginx 版本建议不低于 1.2.6如果你后面打算用动态模块方式加载Nginx 版本必须 ≥ 1.9.11。编译命令在做什么把模块源码解压后进入 Nginx 源码目录执行./configure --add-module/path/to/nginx-http-flv-module make make install--add-module表示把模块静态编进 Nginx 主程序make负责实际编译make install把成品安装到默认目录通常是/usr/local/nginx。整个过程几分钟到十几分钟不等取决于机器性能。想用动态模块怎么办如果你希望模块和 Nginx 主程序解耦方便日后单独升级可以改用动态模块方式./configure --add-dynamic-module/path/to/nginx-http-flv-module make make install编译完成后会生成.so文件使用时需要在 nginx.conf 的events指令之前用load_module加载它否则 Nginx 启动时不会加载该模块。小贴士请务必不要同时把 nginx-http-flv-module 和 nginx-rtmp-module 一起编译进 Nginx。前者已经完整包含了后者的全部功能两者共存会导致符号冲突、行为异常。验证装没装对确认模块已生效编译安装完成后先验证一下模块是否真的进去了。执行/usr/local/nginx/sbin/nginx -V如果编译安装到了默认路径也可以用nginx -V。输出内容里如果能看到--add-module/path/to/nginx-http-flv-module这一行就说明模块已经随 Nginx 一起编译进去了。此时可以用nginx启动服务然后检查logs/error.log确认没有报错。第二步写一份能用的最小配置下面这份配置覆盖了推流收流、HTTP-FLV 播放、统计和控制四件事是官方 README 示例的精简版worker_processes 1; events { worker_connections 4096; } http { include mime.types; default_type application/octet-stream; keepalive_timeout 65; server { listen 80; location /live { flv_live on; # 开启 HTTP-FLV 播放 chunked_transfer_encoding on; add_header Access-Control-Allow-Origin *; } location /stat { rtmp_stat all; # 流状态统计 rtmp_stat_stylesheet stat.xsl; } location /control { rtmp_control all; # 控制模块踢流等操作 } } } rtmp { server { listen 1935; application myapp { live on; # 开启直播 gop_cache on; # 开启 GOP 缓存加快首屏 } } }这里的关键对应关系是rtmp块里的application myapp对应推流地址中的 app 名http块里的location /live对应拉流 URL 中的路径段。两者通过 URL 参数里的app和stream关联起来。配置写好后先做一次语法检查再加载/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload-t检查语法-s reload热加载新配置而不中断现有连接。第三步推流 拉流跑通全流程用 ffmpeg 推流推流用 ffmpeg 即可最简单的做法是直接转封装不转码ffmpeg -re -i /path/to/video.mp4 -c copy -f flv rtmp://example.com/myapp/mystream-re让 ffmpeg 按视频原始速率读取模拟实时直播-c copy表示不重新编码、只做封装转换CPU 占用极低。RTMP 默认端口是 1935如果你在配置里改了端口地址要写成rtmp://example.com:端口/myapp/mystream的形式。注意 stream 名不能省略myapp必须和配置里的 application 名一致。浏览器里用 flv.js 播放推流成功后HTTP-FLV 的拉流地址是http://example.com/live?appmyappstreammystream如果 RTMP 端口不是默认的 1935还需要在 URL 里追加portxxx参数。浏览器端使用 flv.js 即可播放效果如下图用命令行工具播放时要记得给 URL 加引号否则 shell 会把解释成后台运行导致参数丢失ffplay http://example.com/live?appmyappstreammystream多端兼容RTMP、HLS、DASH 都能播除了 HTTP-FLV这个模块同时保留了 RTMP 播放能力也支持 HLS 与 DASH 分发。JW Player 走 RTMP、VLC 走 HTTP-FLV 的播放效果可以参考下图实测多端同时在线互不干扰避坑预警这些坑最容易踩不要和 nginx-rtmp-module 一起编译这是新手最常犯的错。nginx-http-flv-module 已经包含了 RTMP 模块的所有功能再叠加编译只会导致模块加载冲突。flv.js 对编码格式有硬性要求flv.js 只认 H.264 视频编码和 AAC/MP3 音频编码。如果你的推流源是其他编码比如 H.265浏览器里会黑屏无画面。另外flv.js 依赖浏览器的 Media Source Extensions 支持过老的浏览器同样播不了。chunked 传输不是万能的部分播放器不支持 HTTP chunked 分块响应遇到能推不能拉的情况可以在location /live里显式关闭分块chunked_transfer_encoding off;统计接口在多进程下可能看不到数worker_processes如果配置成多进程HTTP 请求会随机分发到各个 workerrtmp_stat可能取不到指定 worker 的数据。想省心就把worker_processes设为 1或者在平台支持时给listen加上reuseport选项缓解惊群问题。端口别搞混RTMP 默认 1935HTTP 默认 80。一旦自定义了端口推流地址要写:port而 HTTP-FLV 拉流地址要用portxxx参数除非 RTMP 用的就是 1935。进阶玩法GOP 缓存、VHost 与 JSON 统计如果你已经跑通了基本链路下面这三个能力值得马上用起来。GOP 缓存在 application 里加一行gop_cache on;新观众加入时无需等待下一个关键帧直接秒开首屏体验提升非常明显。虚拟主机VHost一个 IP 可以挂多个域名。通过server_name配置前缀、后缀或全名匹配规则不同域名可以各自绑定不同的 application 和推拉流规则rtmp { server { listen 1935; server_name www.test.com; # 全名匹配 application myapp { live on; gop_cache on; } } server { listen 1935; server_name *.test.com; # 前缀通配匹配 application myapp { live on; gop_cache on; } } }注意目前多进程模式下 VHost 支持还不完美生产环境建议先用单进程模式。JSON 风格统计把/stat里的rtmp_stat_stylesheet换成rtmp_stat_format json;统计接口就能直接返回 JSON方便程序二次开发对接监控面板。总结与下一步行动到这里你已经完成了从克隆源码到编译安装再到推拉流全链路验证的完整闭环nginx -V确认模块加载成功一份最小配置打通了 RTMP 收流与 HTTP-FLV 分发ffmpeg 推流 flv.js 播放验证了实际效果最后还拿到了 GOP 缓存、VHost、JSON 统计三张进阶牌。下一步建议这样走先在测试环境用官方示例配置完整跑一遍 HLS 和 DASH接着把gop_cache on打开用秒开体验对比一下效果最后结合rtmp_stat的 JSON 输出接一个简单的在线人数监控页面。跑通这些之后你基本就掌握了这个模块在生产环境里最常用的一整套玩法。【免费下载链接】nginx-http-flv-moduleA media streaming server based on nginx-rtmp-module. In addtion to the features nginx-rtmp-module provides, HTTP-FLV, GOP cache, VHosts (one IP for multi domain names) and JSON style statistics are supported now.项目地址: https://gitcode.com/gh_mirrors/ng/nginx-http-flv-module创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表