ZLMediaKit 项目概览
我来帮你分析这个项目的主要功能模块和入手建议。
让我先查看一下项目的整体结构:
根据你提供的 main.cpp 文件和项目文档,我来为你详细讲解 ZLMediaKit 项目:
📚 ZLMediaKit 项目概览
ZLMediaKit 是一个基于 C++11 的高性能流媒体服务框架,支持多种流媒体协议的推拉流、时制、转码等功能。它既可以作为独立的流媒体服务器使用,也可以作为 SDK 集成到你的项目中。
🎯 核心功能模块
从 main.cpp 文件可以看到项目的主要模块:
1. 协议服务器模块
项目支持多种流媒体协议,每个协议都有独立的服务器实例:
| 协议 | 默认端口 | 功能 | 代码位置 |
|---|---|---|---|
| RTSP | 554 / 332(SSL) | 实时流传输协议 | RtspSession |
| RTMP | 1935 / 19350(SSL) | Adobe 流媒体协议 | RtmpSession |
| HTTP/HTTPS | 80 / 443 | HTTP-FLV、HLS、文件服务 | HttpSession |
| WebRTC | 可配置 | 实时音视频通信 | WebRtcSession |
| GB28181 | 10000 | 国标视频监控协议 | RtpServer |
| SRT | 可配置 | 低延时传输协议 | SrtSession |
| Shell | 9000 | Telnet 调试服务器 | ShellSession |
2. Web API 和 Hook 模块
installWebApi(); // HTTP API 接口:用于服务控制
installWebHook(); // HTTP Hook 接口:事件回调通知
- Web API:提供 RESTful 接口管理流媒体服务(如开始推流、停止播放等)
- Web Hook:当有推流、播放等事件时,服务器会回调你的业务服务器
3. 日志系统
Logger::Instance().add(std::make_shared<ConsoleChannel>(...));
Logger::Instance().add(std::make_shared<FileChannel>(...));
- 支持控制台和文件日志
- 支持日志分片、自动清理
4. 配置管理
loadIniConfig(g_ini_file.data()); // 加载配置文件
- 配置文件路径:
config.ini - 支持热加载(无需重启服务器)
5. SSL/TLS 支持
g_reload_certificates(); // 加载 SSL 证书
- 支持 HTTPS、RTMPS、RTSPS 等加密协议
🚀 学习路径建议
第一步:理解项目结构
查看项目的目录结构:
ZLMediaKit/
├── server/ # 服务器主程序(你正在看的 main.cpp)
├── src/ # 核心源码(协议实现)
├── api/ # C API SDK
├── webrtc/ # WebRTC 实现
├── srt/ # SRT 协议实现
├── tests/ # 测试程序
└── www/ # Web 管理界面
第二步:编译和运行
- 编译项目:
mkdir build && cd build
cmake ..
cmake --build .
- 运行服务器:
./MediaServer -c config.ini
- 测试推流(使用 FFmpeg):
ffmpeg -re -i test.mp4 -c copy -f rtsp rtsp://127.0.0.1/live/test
- 测试播放:
在浏览器打开:
http://127.0.0.1/live/test.flv
第三步:熟悉核心接口
1. Web API(RESTful 接口)
示例:获取流列表
curl http://127.0.0.1/index/api/getMediaList
2. Web Hook(事件回调)
查看文档:MediaServer支持的HTTP-HOOK-API
当有人推流时,服务器会回调你的业务服务器:
{
"mediaServerId": "your_server_id",
"app": "live",
"stream": "test",
"schema": "rtsp"
}
第四步:阅读核心代码
推荐阅读顺序:
server/main.cpp:理解服务器启动流程src/Rtsp/RtspSession.cpp:理解 RTSP 协议处理src/Http/HttpSession.cpp:理解 HTTP 请求处理server/WebApi.cpp:理解 API 接口实现tests/目录:查看各种测试示例
第五步:二次开发
场景 1:作为独立服务器使用
- 不需要写代码,直接运行
MediaServer - 通过 Web API 和 Hook 集成到你的业务系统
场景 2:作为 SDK 集成
查看 api/ 目录的 C API 文档:
#include "mk_mediakit.h"
// 初始化
mk_config config = mk_config_create();
mk_env_init(config);
// 推流
mk_pusher pusher = mk_pusher_create(...);
场景 3:C++ 二次开发
参考 tests/ 目录的示例,例如:
// 创建 RTSP 推流器
auto pusher = std::make_shared<RtspPusher>(...);
pusher->publish(url);
📖 重要资源
| 资源 | 链接 |
|---|---|
| 项目 Wiki | github.com/ZLMediaKit/… |
| 快速开始 | github.com/ZLMediaKit/… |
| HTTP API 文档 | github.com/ZLMediaKit/… |
| Hook 文档 | github.com/ZLMediaKit/… |
| 配置文件说明 | github.com/ZLMediaKit/… |
🛠️ 实战建议
- 先跑通服务器:编译并运行
MediaServer,用 FFmpeg 测试推拉流 - 查看日志:理解服务器的运行流程
- 调用 API:用 Postman 测试 Web API
- 修改代码:在
server/main.cpp添加自定义逻辑 - 阅读源码:从简单的模块(如 HTTP)开始看起
❓ 常见问题
Q: 我只想做流媒体转发,需要修改代码吗?
A: 不需要,直接运行 MediaServer 即可。
Q: 如何实现推流鉴权?
A: 实现 on_publish Hook,在你的业务服务器判断是否允许推流。
Q: 如何录制视频?
A: 调用 startRecord API 或配置自动录制。
如果你有具体的开发需求或遇到问题,随时告诉我!🎉