ZLMediaKit RESTful API详解:完整的Web Hook事件与业务逻辑集成
概述
ZLMediaKit作为一款高性能的流媒体服务器框架,提供了完善的RESTful API和Web Hook机制,使开发者能够轻松实现流媒体业务的深度定制和集成。本文将深入解析ZLMediaKit的API架构、Web Hook事件体系,并提供完整的业务集成方案。
核心架构设计
API请求处理流程

配置结构
[api]
apiDebug=1
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
[hook]
enable=1
timeoutSec=10
retry=1
retry_delay=3.0
alive_interval=30.0RESTful API详解
基础API分类
API类别 | 主要功能 | 示例接口 |
服务器管理 | 配置获取、重启服务 |
|
流管理 | 流列表、状态查询 |
|
代理管理 | 拉流推流代理 |
|
会话管理 | 客户端连接管理 |
|
录制管理 | 录像文件操作 |
|
核心API示例
获取媒体流列表
curl "http://127.0.0.1/index/api/getMediaList?secret=your_secret&schema=rtsp"响应格式:
{
"code": 0,
"data": [
{
"schema": "rtsp",
"vhost": "__defaultVhost__",
"app": "live",
"stream": "test",
"readerCount": 3,
"totalBytes": 1024000,
"originType": 1,
"originUrl": "rtsp://source/live/test"
}
]
}添加拉流代理
curl "http://127.0.0.1/index/api/addStreamProxy?secret=your_secret&vhost=__defaultVhost__&app=live&stream=test&url=rtmp://live.example.com/live/stream"获取会话信息
curl "http://127.0.0.1/index/api/getAllSession?secret=your_secret"Web Hook事件体系
事件分类与触发时机
事件类型 | 触发时机 | 业务应用场景 |
| 推流鉴权 | 推流权限控制、流信息记录 |
| 播放鉴权 | 播放权限控制、观看统计 |
| 流量统计 | 流量计费、带宽监控 |
| 流注册注销 | 流状态监控、自动清理 |
| MP4录制完成 | 录制文件处理、转存 |
| 无人观看 | 自动停流、资源释放 |
Web Hook配置示例
[hook]
enable=1
on_publish=http://your-api-server/hook/publish
on_play=http://your-api-server/hook/play
on_flow_report=http://your-api-server/hook/flow
on_stream_changed=http://your-api-server/hook/stream_changed
on_record_mp4=http://your-api-server/hook/record_mp4
on_stream_none_reader=http://your-api-server/hook/none_reader
timeoutSec=10
retry=2Hook请求数据结构
推流鉴权事件 (on_publish)
{
"mediaServerId": "your_server_id",
"hook_index": 123456789,
"schema": "rtmp",
"vhost": "__defaultVhost__",
"app": "live",
"stream": "test",
"params": "",
"ip": "192.168.1.100",
"port": 1935,
"id": "client_123",
"originType": 0,
"originTypeStr": "unknown"
}播放鉴权事件 (on_play)
{
"mediaServerId": "your_server_id",
"hook_index": 123456790,
"schema": "rtsp",
"vhost": "__defaultVhost__",
"app": "live",
"stream": "test",
"params": "token=abc123",
"ip": "192.168.1.101",
"port": 554,
"id": "client_456"
}流量统计事件 (on_flow_report)
{
"mediaServerId": "your_server_id",
"hook_index": 123456791,
"schema": "rtmp",
"vhost": "__defaultVhost__",
"app": "live",
"stream": "test",
"params": "",
"totalBytes": 10485760,
"duration": 3600,
"player": true,
"ip": "192.168.1.102",
"port": 1935,
"id": "client_789"
}业务逻辑集成方案
鉴权系统集成
class AuthHandler:
def handle_publish(self, data):
"""推流鉴权处理"""
# 验证推流权限
if not self.check_publish_permission(data['app'], data['stream']):
return {"code": -1, "msg": "推流权限不足"}
# 记录推流信息
self.record_stream_event(data)
return {"code": 0, "msg": "success"}
def handle_play(self, data):
"""播放鉴权处理"""
# 验证播放token
token = data.get('params', '').split('token=')[-1]
if not self.validate_token(token):
return {"code": -1, "msg": "无效的播放token"}
return {"code": 0, "msg": "success"}流状态监控系统
class StreamMonitor {
constructor() {
this.activeStreams = new Map();
}
handleStreamChanged(data) {
const streamKey = `${data.vhost}/${data.app}/${data.stream}`;
if (data.regist) {
// 流注册
this.activeStreams.set(streamKey, {
schema: data.schema,
startTime: Date.now(),
readerCount: 0
});
console.log(`流上线: ${streamKey}`);
} else {
// 流注销
this.activeStreams.delete(streamKey);
console.log(`流下线: ${streamKey}`);
}
}
handleFlowReport(data) {
// 流量统计处理
this.updateBandwidthUsage(data);
}
}自动伸缩资源管理
public class AutoScalingManager {
private static final int MAX_STREAMS_PER_NODE = 100;
public JsonNode handleStreamPublish(JsonNode data) {
int currentStreams = getCurrentStreamCount();
if (currentStreams >= MAX_STREAMS_PER_NODE) {
// 触发水平扩展
scaleOut();
return createResponse(-1, "服务器负载过高,请稍后重试");
}
return createResponse(0, "success");
}
public JsonNode handleStreamNoneReader(JsonNode data) {
// 无人观看时自动关闭流
return createResponse(0, "success", Map.of("close", true));
}
}高级配置与优化
性能优化配置
[general]
maxStreamWaitMS=15000
streamNoneReaderDelayMS=20000
mergeWriteMS=0
[hook]
timeoutSec=5
retry=1
retry_delay=1.0集群模式配置
[cluster]
origin_url=rtmp://origin1:1935/%s/%s;rtmp://origin2:1935/%s/%s
timeout_sec=15
retry_count=3安全配置
[api]
secret=your_secure_random_secret
[http]
allow_ip_range=192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255错误处理与调试
常见错误码
错误码 | 含义 | 解决方案 |
-100 | 鉴权失败 | 检查secret配置和IP白名单 |
-300 | 参数不合法 | 验证请求参数完整性 |
-400 | 代码异常 | 查看服务器日志排查问题 |
-500 | 接口未找到 | 检查API路径是否正确 |
调试模式启用
# 启用API调试日志
curl "http://127.0.0.1/index/api/setServerConfig?secret=your_secret&api.apiDebug=1"
# 获取服务器状态
curl "http://127.0.0.1/index/api/getStatistic?secret=your_secret"最佳实践建议
- 密钥管理: 使用强随机密钥并定期更换
- 超时设置: 根据网络状况合理设置hook超时时间
- 重试机制: 配置适当的重试次数和间隔
- 监控告警: 实现hook失败告警机制
- 性能优化: 使用异步处理避免阻塞主线程
- 日志记录: 完整记录所有API和hook操作
总结
ZLMediaKit的RESTful API和Web Hook机制提供了强大的流媒体业务集成能力。通过合理配置和深度定制,可以实现完整的流媒体业务管理系统,包括权限控制、状态监控、自动伸缩等功能。本文提供的配置示例和代码模板可以帮助开发者快速构建稳定高效的流媒体服务平台。
在实际部署中,建议根据业务需求选择合适的hook事件,并实现相应的业务逻辑处理。同时注意性能优化和安全防护,确保系统的稳定性和安全性。
















