ZLMediaKit 源代码入门

ZLMediaKit 是一个基于 C++11 开发的高性能流媒体服务器框架,支持 RTSP、RTMP、HLS、HTTP-FLV 等协议。以下是源代码入门的详细指南:

1. 源码结构概览

主要目录结构:

text

ZLMediaKit/
├── cmake/             # CMake 构建配置
├── release/           # 发布相关文件
├── src/               # 核心源代码
│   ├── Common/        # 公共工具类
│   ├── Device/        # 设备相关代码
│   ├── Http/          # HTTP 协议实现
│   ├── Player/        # 播放器相关
│   ├── Poller/        # 事件轮询器
│   ├── Protocol/      # 各种流媒体协议实现
│   ├── Rtmp/          # RTMP 协议实现
│   ├── Rtsp/          # RTSP 协议实现
│   ├── Shell/         # 命令行交互
│   ├── Util/          # 工具类
│   └── Web/           # Web 相关
├── tests/             # 测试代码
└── www/               # Web 界面资源

2. 核心模块分析

2.1 事件循环 (Poller)

  • EventPoller.h/cpp: 事件轮询器核心,基于 epoll/kqueue

  • Poller/Timer.h: 定时器实现

  • 采用多线程事件循环模型,每个线程独立运行一个事件循环

2.2 协议支持

  • Protocol/ 目录下包含各种协议实现:

    • Rtsp : RTSP 协议实现

    • Rtmp : RTMP 协议实现

    • Http : HTTP/WebSocket 实现

    • Srt : SRT 协议实现

2.3 媒体处理

  • Media/ 目录包含媒体相关处理:

    • MediaSource.h : 媒体源抽象

    • MultiMediaSourceMuxer.h : 多路复用器

    • HlsMaker.h : HLS 生成器

3. 代码阅读

3.1 关键代码阅读

  • src/main.cpp,入口文件,程序初始化流程。

  • src/Rtsp/ 目录下的会话管理

  • src/Media/ 下的多路复用器实现

  • src/Poller/ 中的事件循环核心

3.2 核心类关系

  1. EventPoller: 事件循环核心

  2. Socket: 网络套接字封装

  3. MediaSource: 媒体源基类

  4. RtmpSession/RtspSession: 协议会话实现

3.3 关键流程

  1. 服务器启动流程:

    • 创建事件轮询器

    • 初始化各协议服务器

    • 绑定端口开始监听

  2. 客户端连接处理流程:

    • 接受新连接

    • 创建对应的 Session 对象

    • 处理协议交互

4. 核心架构解析

4.1 高性能网络模型

多线程 Reactor 模式增强版

  • 每个 EventPoller 线程独立运行事件循环

  • 采用无锁队列进行线程间通信

  • 智能的任务负载均衡算法

// 典型事件循环核心代码片段 (EventPoller.cpp)
void EventPoller::runLoop() {while (!_exit_flag) {_timer_map->getMinimalTimer(); // 处理定时器int64_t minDelay = _timer_map->getMinimalTimer();int ret = _epoller.waitEvent(minDelay); // epoll_waithandleEventResult(ret); // 处理IO事件_async_task_queue->inputOtherThread(...); // 处理跨线程任务}
}

性能优化关键点

  • 使用 EPOLLEXCLUSIVE 避免惊群效应

  • 采用时间轮(TimingWheel)管理定时器

  • 零拷贝技术减少内存拷贝

4.2 媒体处理流水线

多级媒体处理架构

text

[ 采集源 ] -> [ 协议解封装 ] -> [ 转码/转封装 ] -> [ 协议封装 ] -> [ 发送 ]

关键类关系

5. 调试与开发环境搭建

5.1 编译环境

bash

git clone https://github.com/ZLMediaKit/ZLMediaKit.git
cd ZLMediaKit
git submodule update --init
mkdir build
cd build
cmake ..
make -j4

5.2 调试技巧

  1. 使用 GDB/LLDB 调试

    # 查看事件循环状态
    p *(EventPoller*)0x7fffffff# 追踪媒体帧流转
    watch *(uint8_t*)media_frame_ptr->data()# 分析内存池状态
    p toolkit::ResourcePool<BufferRaw>::Instance()
  2. 开启 DEBUG 级别日志

  3. 使用 Wireshark 抓包分析协议交互

    # 使用tcpdump抓取特定流
    tcpdump -i eth0 'port 1935 and host 192.168.1.100' -w rtmp.pcap# 使用ffmpeg测试极端情况
    ffmpeg -re -f lavfi -i testsrc -c:v libx264 -f flv \'rtmp://localhost/live/stream?token=secure_key'
  4. 通过内置API获取运行时状态

    # 获取媒体源列表
    curl http://127.0.0.1:8080/api/getMediaList# 获取线程负载
    curl http://127.0.0.1:8080/api/getThreadsLoad# 获取内存信息
    curl http://127.0.0.1:8080/api/getStatistic

6. 常见扩展开发

6.1 添加新协议

  1. 在 Protocol/ 下创建新目录

  2. 继承 TcpSession 或 UdpSession

  3. 实现协议解析逻辑

  4. 在服务器初始化时注册新协议

示例:

  1. 继承 TcpSession 实现协议解析

    class MyProtocolSession : public TcpSession {
    public:void onRecv(const Buffer::Ptr &buf) override {// 自定义协议解析逻辑if (parseComplete(buf)) {processMediaFrame(buf);}}
    };
  2. 注册协议到服务器

    // 在main函数中注册
    auto server = std::make_shared<TcpServer>();
    server->start<MyProtocolSession>(port);

6.2 自定义媒体处理

  1. 继承 MediaSource 实现自定义媒体源

  2. 实现帧数据生成逻辑

  3. 注册到 MediaRegistry

示例:实现视频滤镜

class VideoFilter : public Frame {
public:Frame::Ptr filter(const Frame::Ptr &frame) {// 获取原始数据auto data = frame->data();// 处理视频帧 (示例:简单的灰度处理)if (frame->getCodecId() == CodecH264) {processYUV(data, frame->size());}return std::make_shared<Frame>(...);}
};// 在MediaSource中应用
source->setFilter([](const Frame::Ptr &frame) {return VideoFilter().filter(frame);
});

7. 性能调优指南

7.1 关键性能指标

指标优化方向相关配置项
连接数线程数/文件描述符限制thread_num, max_connections
延迟缓冲区大小/发送策略send_rtp_packet_size
CPU占用编解码优化/线程绑定enable_affinity
内存占用对象池/缓存策略media_timeout_ms

7.2 高级配置示例

ini

; config.ini 关键配置
[api]
secret=your_api_key ; 安全API访问[rtmp]
handshakeSecond=10 ; RTMP握手超时
keepAliveSecond=15 ; 保活时间[hls]
fileBufSize=65536 ; HLS文件缓冲区
segDur=2 ; 分片时长(秒)

7.3 性能分析工具

  • perf 进行热点分析

  • valgrind 检查内存问题

  • gperftools 分析CPU使用

8. 二次开发案例

8.1 集成 AI 分析功能

// 在FrameDispatcher中添加AI处理
class AIVideoAnalyzer : public FrameDispatcher {
public:void inputFrame(const Frame::Ptr &frame) override {auto result = _ai_model->analyze(frame->data());if (result.alarm) {triggerAlarm(result);}// 继续传递帧数据FrameDispatcher::inputFrame(frame);}
};// 注册到媒体源
source->setFrameDispatcher(std::make_shared<AIVideoAnalyzer>());

8.2 自定义负载均衡策略

// 继承LoadBalancer实现自定义策略
class CustomLoadBalancer : public LoadBalancer {
public:EventPoller::Ptr getPoller() override {// 基于CPU温度选择的策略auto temp = getCPUTemperature();return selectCoolestPoller(temp);}
};// 替换默认实现
EventPollerPool::setLoadBalancer(std::make_shared<CustomLoadBalancer>());

9. 学习资源

  1. 官方文档: ZLMediaKit Wiki

  2. 示例代码: tests/ 目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90539.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能Agent场景实战指南 Day 21:Agent自主学习与改进机制

【智能Agent场景实战指南 Day 21】Agent自主学习与改进机制 文章内容 开篇 欢迎来到"智能Agent场景实战指南"系列的第21天&#xff01;今天我们将深入探讨智能Agent的自主学习与改进机制——这是使Agent能够持续提升性能、适应动态环境的核心能力。在真实业务场景…

微信小程序中英文切换miniprogram-i18n-plus

原生微信小程序使用 miniprogram-i18n-plus第一步&#xff1a;npm install miniprogram-i18n-plus -S安装完成后&#xff0c;会在项目文件文件夹 node_modules文件里生成 miniprogram-i18n-plus&#xff0c; 然后在工具栏-工具-构建npm&#xff0c;然后看到miniprogram_npm里面…

LeetCode 127:单词接龙

LeetCode 127&#xff1a;单词接龙问题本质&#xff1a;最短转换序列的长度 给定两个单词 beginWord 和 endWord&#xff0c;以及字典 wordList&#xff0c;要求找到从 beginWord 到 endWord 的最短转换序列&#xff08;每次转换仅改变一个字母&#xff0c;且中间单词必须在 wo…

docker搭建ray集群

1. 安装docker 已安装过docker 没安装流程 启动 Docker 服务&#xff1a; sudo systemctl start docker sudo systemctl enable docker # 设置开机即启动docker验证 Docker 是否安装成功&#xff1a; docker --version2. 部署ray # 先停止docker服务 systemctl stop docker…

【iOS】SideTable

文章目录前言1️⃣Side Table 的核心作用&#xff1a;扩展对象元数据存储1.1 传统对象的内存限制1.2 Side Table 的定位&#xff1a;集中式元数据仓库2️⃣Side Table 的底层结构与关联2.1 Side Table 与 isa 指针的关系2.2 Side Table 的存储结构2.3 SideTable 的工作流程3️⃣…

【Spring Cloud Gateway 实战系列】高级篇:服务网格集成、安全增强与全链路压测

一、服务网格集成&#xff1a;Gateway与Istio的协同作战在微服务架构向服务网格演进的过程中&#xff0c;Spring Cloud Gateway可与Istio形成互补——Gateway负责南北向流量&#xff08;客户端到集群&#xff09;的入口管理&#xff0c;Istio负责东西向流量&#xff08;集群内服…

一文说清楚Hive

Hive作为Apache Hadoop生态的核心数据仓库工具&#xff0c;其设计初衷是为熟悉SQL的用户提供大规模数据离线处理能力。以下从底层计算框架、优点、场景、注意事项及实践案例五个维度展开说明。 一、Hive底层分布式计算框架对比 Hive本身不直接执行计算&#xff0c;而是将HQL转换…

SeaweedFS深度解析(三):裸金属单机和集群部署

#作者&#xff1a;闫乾苓 文章目录2.2.4 S3 Server&#xff08;兼容 Amazon S3 的接口&#xff09;2.2.5 Weed&#xff08;命令行工具&#xff09;3、裸金属单机和集群部署3.1 裸金属单机部署3.1.1安装 SeaweedFS3.1.2 以Master模式启动2.2.4 S3 Server&#xff08;兼容 Amazon…

相机ROI 参数

相机的 ROI&#xff08;Region of Interest&#xff0c;感兴趣区域&#xff09; 参数&#xff0c;是指通过设置图像传感器上 特定区域 作为有效成像区域&#xff0c;从而只采集该区域的图像数据&#xff0c;而忽略其他部分。这一功能常用于工业相机、科研相机、高速相机等场景&…

Vue基础(24)_VueCompinent构造函数、Vue实例对象与组件实例对象

分析上一节代码中的school组件&#xff1a;该组件是一个名为VueCompinent的构造函数。截取部分vue.js源码&#xff0c;分析Vue.extend&#xff1a;// 定义一个名为VueComponent的构造函数对象Sub&#xff0c;往Sub对象调用_init(options)方法&#xff0c;参数为配置项&#xff…

萤石云替代产品摄像头方案萤石云不支持TCP本地连接-东方仙盟

不断试错东方仙盟深耕科研测评&#xff0c;聚焦前沿领域&#xff0c;以严谨标准评估成果&#xff0c;追踪技术突破&#xff0c;在探索与验证中持续精进&#xff0c;为科研发展提供参考&#xff0c;助力探路前行 萤石云价格萤石云的不便于使用 家庭场景&#xff1a;成本可控与隐…

C51:用DS1302时钟读取和设置时间

因为在ds1302.c文件中包含了写ds1302&#xff08;51向ds1302写数据&#xff09;和读ds1302&#xff08;51从ds1302读数据&#xff09;的两个函数&#xff0c;我们根据文件中提供的函数来写读取时间和设置时间的函数即可ds1302.c文件源码如下&#xff0c;需要的同学可以参考一下…

webrtc整体架构

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一套支持浏览器和移动应用进行实时音视频通信的开源技术标准&#xff0c;其架构设计围绕 “实时性”“低延迟”“跨平台” 和 “安全性” 展开&#xff0c;整体可分为核心引擎层、API 层、支撑服务层三大部分&…

浅析PCIe 6.0 ATS地址转换功能

在现代高性能计算和虚拟化系统中,地址转换(Address Translation)是一个至关重要的机制。随着 PCIe 设备(如 GPU、网卡、存储控制器)直接访问系统内存的能力增强,设备对虚拟内存的访问需求日益增长。 为了提升性能并确保安全访问,Address Translation Services(ATS) 应…

【前端】ikun-pptx编辑器前瞻问题二: pptx的压缩包结构,以及xml正文树及对应元素介绍

文章目录PPTX文件本质&#xff1a;一个压缩包核心文件解析1. 幻灯片内容文件 (ppt/slides/slideX.xml)2. 元素类型解析文本框元素 (p:sp)图片元素 (p:pic)单位系统开发注意事项参考工具pptx渲染路线图PPTX文件本质&#xff1a;一个压缩包 PPTX文件实际上是一个遵循Open XML标准…

分布式任务调度实战:XXL-JOB与Elastic-Job深度解析

告别传统定时任务的局限&#xff0c;拥抱分布式调度的强大与灵活 在现代分布式系统中&#xff0c;高效可靠的任务调度已成为系统架构的核心需求。面对传统方案&#xff08;如Timer、Quartz&#xff09;在分布式环境下的不足&#xff0c;开发者急需支持集群调度、故障转移和可视…

Windows 11下纯软件模拟虚拟机的设备模拟与虚拟化(仅终端和网络)

Windows 11下用GCC的C代码实现的虚拟机需要终端输入/输出&#xff08;如串口或虚拟控制台&#xff09;和网络连接&#xff0c;但不需要完整的硬件设备&#xff08;如磁盘、显卡、USB 等&#xff09;。在终端输入/输出方面&#xff0c;参考qemu的源代码&#xff0c;但不调用qemu…

CCF-GESP 等级考试 2025年6月认证Python六级真题解析

1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;第1题 下列哪一项不是面向对象编程&#xff08;OOP&#xff09;的基本特征&#xff1f;&#xff08; &#xff09;A. 继承 (Inheritance) B. 封装 (Encapsul…

C++中的deque

1. 什么是 Deque&#xff1f; 核心概念&#xff1a; Deque 是 “Double-Ended Queue”&#xff08;双端队列&#xff09;的缩写。你可以把它想象成一个可以在两端&#xff08;头部和尾部&#xff09;高效地进行添加或删除操作的线性数据结构。关键特性&#xff1a; 双端操作&am…

GNU到底是什么,与Unix和Linux是什么关系

GNU&#xff08;发音为 /ɡnuː/&#xff0c;类似“革奴”&#xff09;是一个自由软件操作系统项目&#xff0c;由理查德斯托曼&#xff08;Richard Stallman&#xff09;于1983年发起&#xff0c;目标是创建一个完全由自由软件组成的类Unix操作系统。它的名字是一个递归缩写&a…