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
英文地址,請注明出處:http://en.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…