模块化架构设计指南:ZLMediaKit如何实现千万级流媒体并发
一、核心架构概览:从单文件到分布式系统的演进之路
ZLMediaKit作为支持WebRTC/RTSP/RTMP等10+协议的流媒体框架,其架构设计遵循"高内聚、低耦合"原则,通过命名空间隔离与继承体系实现组件复用。项目核心代码集中在src/目录,采用三层架构设计:
- 协议适配层:src/Rtmp/、src/Rtsp/等目录实现不同协议的编解码与会话管理
- 媒体处理层:src/Codec/提供H.264/AAC等编解码能力,src/Record/实现MP4/HLS录制
- 核心服务层:src/Common/定义基础接口,src/Http/提供Web服务支撑
二、命名空间设计:边界清晰的模块化隔离
项目通过命名空间实现逻辑隔离,在src/Common/config.h中定义了12个核心命名空间:
namespace mediakit {
namespace Broadcast { ... } // 广播配置
namespace Protocol { ... } // 协议参数
namespace Http { ... } // HTTP配置
// 省略其他8个命名空间
}
这种设计使不同模块的配置参数严格分离,例如RTSP协议配置仅在mediakit::Rtsp命名空间中生效,避免全局变量污染。协议实现目录如src/Rtmp/下的所有类均位于mediakit根命名空间,通过目录结构而非嵌套命名空间实现物理隔离。
三、类继承体系:面向接口编程的最佳实践
框架大量采用"接口+实现"模式,以推流模块为例:
// [src/Pusher/PusherBase.h](https://link.gitcode.com/i/0550e1e913999628dfa588f0db439d0d)
class PusherBase : public PlayerBase, public MediaSourceEvent {
public:
virtual int startPush(const string &url) = 0;
// 纯虚函数定义推流接口
};
// [src/Rtmp/RtmpPusher.h](https://link.gitcode.com/i/09697dfa932c0a93365caa4773c6e3a6)
class RtmpPusher : public PusherBase {
public:
int startPush(const string &url) override;
// RTMP协议的具体实现
};
这种设计使上层业务可通过PusherBase接口统一操作,无需关心底层协议差异。类似模式广泛应用于PlayerBase、MediaSource等核心组件。
四、组件复用策略:三个层级的代码共享机制
1. 工具类复用
src/Common/提供基础工具类,如MultiMediaSourceMuxer实现媒体源复用:
// [src/Common/MultiMediaSourceMuxer.h](https://link.gitcode.com/i/2bc04eaffa1305f979e828c8dca56624)
class MultiMediaSourceMuxer : public MediaSourceEventInterceptor,
public MediaSink,
public std::enable_shared_from_this<MultiMediaSourceMuxer> {
// 实现音视频流的混合与转发
};
2. 协议无关接口
src/Extension/Track.h定义媒体轨道接口,使不同编码格式统一处理:
class Track : public TrackSource, public FrameWriterInterface {
public:
virtual CodecId getCodecId() const = 0;
virtual int getSampleRate() const { return 0; }
// 媒体轨道通用接口
};
3. 模板方法模式
src/Http/TsPlayerImp.h通过模板实现播放器逻辑复用:
class TsPlayerImp : public PlayerImp<TsPlayer, PlayerBase>, private TrackListener {
// PlayerImp模板封装通用播放逻辑
};
五、典型应用场景:从代码结构到业务实现
以RTMP推流功能为例,完整调用链涉及:
- MediaPusher - 业务入口封装
- PusherProxy - 推流代理管理
- RtmpPusher - 协议具体实现
- RtmpProtocol - 协议编解码
- MultiMediaSourceMuxer - 媒体数据处理
这种分层调用使每个组件专注单一职责,通过WebApi暴露的接口可快速集成到业务系统。
六、架构优化建议:基于实际项目的经验总结
- 接口稳定性:核心接口如MediaSource应保持向后兼容
- 依赖管理:通过CMakeLists.txt控制模块依赖,避免循环引用
- 配置隔离:参考src/Common/config.h的命名空间配置模式
- 性能优化:重点关注src/Rtp/RtpSession.cpp的内存池实现
项目提供完整的postman/接口测试用例和webrtc/示例代码,建议结合实际场景深入学习。
附录:核心模块速查表
| 模块功能 | 核心文件 | 关键类 |
|---|---|---|
| RTMP协议 | src/Rtmp/RtmpSession.h | RtmpSession |
| 媒体录制 | src/Record/MP4Recorder.h | MP4Recorder |
| WebRTC支持 | src/webrtc/WebRtcSession.h | WebRtcSession |
| HTTP服务 | src/Http/HttpSession.h | HttpSession |
通过这套架构设计,ZLMediaKit实现了单服务器支持10万级并发连接的能力,其模块化思想值得所有C++流媒体项目借鉴。完整代码结构可参考src/目录组织,建议结合server/main.cpp的启动流程理解整体设计。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




