深入理解 ZLMediaKit HTTP Hook 机制

文章目录

  • [一、什么是 ZLMediaKit HTTP Hook 机制?](#一、什么是 ZLMediaKit HTTP Hook 机制?)
  • [二、核心对比:为什么要用 Hook?](#二、核心对比:为什么要用 Hook?)
  • [三、为什么 Hook 能影响 ZLM 行为?](#三、为什么 Hook 能影响 ZLM 行为?)
  • [四、Hook 事件详解](#四、Hook 事件详解)
  • [五、Spring Boot 实现关键要点](#五、Spring Boot 实现关键要点)
  • 六、最佳实践建议
  • 七、总结

在做 系统级直播开发 时,很多人都会遇到一个经典问题:

ZLMediaKit 的 WebHook 机制到底是什么?它能干什么?
项目中到底该怎么用?

核心结论:

事件驱动机制 → 实时通知 ZLMediaKit 关键业务事件 → 允许自定义处理逻辑
你要实现什么业务 ------ 就监听什么 Hook 事件并快速返回结果


ZLMediaKit_Web Hook

一、什么是 ZLMediaKit HTTP Hook 机制?

ZLMediaKit 提供了一套 HTTP WebHook 机制 ,当服务器发生关键事件(推流/播放/状态改变/无人观看/未找到流/录制完成等)时,会主动 通过 HTTP POST JSON 向你预设的 URL 推送事件

这就像一个"反向调用 API":

ZLM 事件发生 → ZLM 发起请求 → 你根据业务做处理 → 返回响应控制后续行为。

📌 Hook 不是轮询,而是被动实时通知,适合做鉴权、统计、自动管理等。


二、核心对比:为什么要用 Hook?

机制 用途 是否影响 ZL 行为 你能做什么
on_publish 推流鉴权 ✅ 是 推流权限/规则校验
on_play 播放鉴权 ✅ 是 播放防盗链/统计
on_stream_none_reader 无人观看 ✅ 是 决定是否关闭无人的流
on_stream_not_found 流未找到 ❌ 否 做按需拉流(懒加载)
on_stream_changed 流上线/下线 ❌ 否 更新流状态表
on_server_keepalive 节点心跳 ❌ 否 集群节点存活检查
on_server_started 节点启动 ❌ 否 节点注册/初始化
on_rtp_server_timeout RTP 超时 ❌ 否 RTP 链路异常监控
on_record_mp4 录制完成 ❌ 否 录制后处理/入库

Hook 的本质是 事件通知 + 结果决策 的事件驱动机制。([ZLMediaKit][1])


三、为什么 Hook 能影响 ZLM 行为?

核心逻辑来自 ZLMediaKit 的配置和 WebHook 处理逻辑:

复制代码
[hook]
enable=1                         # 启用 HTTP Hook
timeoutSec=10                   # ZL 等待回调超时时间
on_publish=...                 # 推流鉴权事件地址
on_play=...                    # 播放鉴权事件地址
on_stream_none_reader=...      # 无人观看事件
on_stream_not_found=...        # 流未找到事件
on_stream_changed=...          # 流上线/下线事件
on_server_keepalive=...        # 心跳事件
on_server_started=...          # 启动事件
on_rtp_server_timeout=...      # RTP 超时
on_record_mp4=...              # 录制完成

当 ZLMediaKit 发生对应事件时,它会将事件 JSON 通过 HTTP POST 推送到你设置的 URL。开发者可以根据业务做处理并返回响应控制 ZLMediaKit 的下一步行为。


四、Hook 事件详解

🟣 1. on_publish --- 推流鉴权(核心)

触发时机:

推流开始(RTMP/RTSP/RTP)触发。

常见用途:

  • 校验 URL Token
  • 白名单/黑名单 IP 控制
  • 限制设备推流规则
  • 记录推流日志

📌 影响行为

返回非 code=0 ➜ 推流拒绝,否则允许推流。


🟢 2. on_play --- 播放鉴权 / 防盗链

触发时机:

每次播放(RTMP/RTSP/HLS/HTTP-FLV/ws-flv)时触发。

用途:

  • 校验播放 Token / 防盗链
  • 统计播放次数 / 观看时长
  • 限制并发播放

📌 影响行为

返回非 code=0 ➜ 拒绝播放。


🔵 3. on_stream_none_reader --- 无人观看

触发时机:

当一个流在设定延迟内无人观看时触发。

用途:

  • 自动关闭无人流
  • 推送通知、释放资源

📌 影响行为

返回 JSON { code:0, close:true/false }
close:true 表示通知 ZLMediaKit 关闭该无人流。


🟡 4. on_stream_not_found --- 懒加载 / 按需拉流

触发时机:

客户端请求某个流但服务器当前找不到该流时触发。

用途:

  • 自动向上游摄像机或推流器拉流
  • 按需创建代理拉流(例如 addStreamProxy

📌 注意

这个事件 不依赖返回值,只是通知你去做操作。


🟠 5. on_stream_changed --- 流状态变化通知

触发时机:

流上线(推流后真正注册)或下线时触发。

用途:

  • 同步数据库流在线状态
  • 监控/告警
  • 推送业务系统流状态变更

📌 不影响 ZLMediaKit 行为

仅作为通知事件。


🔴 6. on_server_keepalive --- 节点心跳

触发时机:

ZLM 节点定期上报心跳。

用途:

  • 保活检测
  • 集群节点状态表管理

📌 不影响 ZLMediaKit 行为

仅用于节点健康监控。


🔵 7. on_server_started --- 节点启动事件

触发时机:

ZLMediaKit 完成启动后触发。([ZLMediaKit][1])

用途:

  • 向注册中心注册
  • 初始化监控链路
  • 采集启动参数

📌 不影响 ZLMediaKit 行为

仅用于业务系统初始化逻辑。([ZLMediaKit][1])


🟣 8. on_rtp_server_timeout --- RTP 超时

触发时机:

ZLMediaKit 收不到上游 RTP 数据超时后触发。[3])

用途:

  • RTP 失败告警
  • 重新拉取或清理相关资源

📌 不影响 ZLMediaKit 行为


🟢 9. on_record_mp4 --- MP4 录制完成

触发时机:

ZLMediaKit 录制 MP4 文件完成后触发。

用途:

  • 入库录制文件
  • 后续转码发布 CDN
  • 生成封面截图

📌 不影响 ZLMediaKit 行为


五、Spring Boot 实现关键要点

🧠 1. 必须用 @RequestBody 接收 JSON

ZLM 发送数据是 JSON,不接会解析失败。

🧠 2. 鉴权类事件要快速返回

ZLMediaKit 有超时等待策略,慢会影响推流/播放。

🧠 3. 非敏感结果可异步处理

on_stream_not_found、on_stream_changed、on_record_mp4 等可以发布事件异步消费。

🧠 4. 返回结构要严格符合 ZLMediaKit 要求

错误返回可能视为拒绝访问。


六、最佳实践建议

🎯 推流/播放鉴权 --- 必须做,否则默认全部允许

🎯 无人流自动关闭 --- 用于节省资源

🎯 按需拉流策略 --- 用于节省上游带宽

🎯 流状态表同步 --- 便于监控 / 大屏联动

🎯 节点心跳/启动 --- 用于节点管理 / 高可用集群


七、总结

ZLMediaKit HTTP Hook 是一种事件驱动机制

ZLM → 事件 → HTTP POST → 你的服务处理 → 控制返回

它让你可以实现:

  • 鉴权
  • 自动管理流生命周期
  • 统计与监控
  • 异常与资源管理
相关推荐
迎仔24 分钟前
10-网络安全监控与事件响应:数字世界的智能监控与应急系统
网络·安全·web安全
上海合宙LuatOS1 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
深圳市恒星物联科技有限公司2 小时前
水质流量监测仪:复合指标监测的管网智能感知设备
大数据·网络·人工智能
三水不滴2 小时前
有 HTTP 了为什么还要有 RPC?
经验分享·笔记·网络协议·计算机网络·http·rpc
科技块儿3 小时前
2026年我会推荐哪些IP归属地查询网站?
网络·ip地址·ip归属地·运维工具·网络工具·实用网站·2026工具推荐
米羊1213 小时前
已有安全措施确认(中)
网络
迎仔4 小时前
A-算力中心网络隔离总览:数字世界的“酒店房间“
网络
宝塔面板4 小时前
AllinSSL 一站式搞定 SSL 自动续期:永久免费,开源可自托管
网络·网络协议·ssl
csdn今天倒闭了吗4 小时前
飞牛lucky配置ipv6 ddns+ssl+反向代理
网络·网络协议·ssl
JavinLu4 小时前
ios 配置了代理且使用 chls.pro/ssl 下载不了证书,无法弹出下载证书的提示问题
网络协议·ios·ssl