1. ZLMediaKit 源码架构解析
ZLMediaKit 是一个高性能的流媒体服务器框架,采用 C++11 开发,支持 RTSP、RTMP、HTTP、WebSocket 等多种协议。其核心架构设计体现了现代流媒体服务器的典型特征,包括多线程模型、事件驱动、协议栈抽象等关键技术。
1.1 主程序启动流程
主函数 start_main 是程序的入口点,负责初始化整个服务器环境:
cpp复制int start_main(int argc,char *argv[]) {
{
CMD_main cmd_main;
try {
cmd_main.operator()(argc, argv); // 命令行参数解析
} catch (ExitException &) {
return 0;
} catch (std::exception &ex) {
cout << ex.what() << endl;
return -1;
}
}
bool bDaemon = cmd_main.hasKey("daemon"); //后台守护
g_ini_file = cmd_main["config"]; // 配置文件路径
// 设置线程池和CPU亲和性
EventPollerPool::setPoolSize(threads);
WorkThreadPool::setPoolSize(threads);
EventPollerPool::enableCpuAffinity(affinity);
WorkThreadPool::enableCpuAffinity(affinity);
// 加载配置文件
loadIniConfig(g_ini_file.data());
// 启动各协议服务器
std::string listen_ip = mINI::Instance()[General::kListenIP];
uint16_t rtspPort = mINI::Instance()[Rtsp::kPort];
if (rtspPort) { rtspSrv->start<RtspSession>(rtspPort, listen_ip); }
// 其他协议服务器启动类似...
}
关键点解析:
- 命令行参数处理采用专门的
CMD_main类封装 - 支持守护进程模式运行
- 线程池设计采用双池结构:
EventPollerPool处理IO事件,WorkThreadPool处理计算任务 - 配置文件采用INI格式,通过
mINI类管理
提示:在实际部署时,建议根据CPU核心数合理设置线程池大小,通常设置为CPU逻辑核心数的1-2倍效果最佳。
