🎬 第十二章 ZLMediaKit搭建直播平台
📄 一句话概括

ZLMediaKit 只给 CMake,不给现成的 VS 工程文件。 所以第一次编之前,工具链缺一样就卡在第一步。

📝 本节和前面几节的关系

第十一章的 SRS 用自带的 configure,这一章换成 CMake。 12.2 到 Linux 上编,命令少一样、麻烦也一样。

一、为什么 Windows 上编它麻烦

SRS 用的是自己写的 configure,ZLMediaKit 用的是 CMake。 CMake 本身不编译,它只负责「生成某个编译器能认的工程文件」。 所以在 Windows 上,链条是「CMake → VS 工程 → 编译」。

这条链上任何一环断了,报错都很像: 都是「找不到命令」,看不出是缺哪一样。 再加上 ZLMediaKit 依赖一个子模块 ZLToolKit, 子模块没初始化时也是编译期才报「找不到头文件」。

所以 Windows 上最常见的三种卡点,按出现顺序是: ① 没有 CMake,第一条命令就失败; ② 有 CMake 但不在 VS 的环境里,生成时报找不到编译器; ③ 编到一半报找不到 ZLToolKit 的头文件,是子模块没拉。

二、工具链先查,缺一样都卡住

要准备四样:CMake 3.10 以上、VS 2017 以上、OpenSSL、libsrtp。 前三样必装,第四样只在开了 WebRTC 时才要。

这里有个区分很重要: 「编不过」是工具链问题,「编过了但用不了」是可选依赖没装。 前者在编译期就崩,后者要等启动甚至等观众连上来才暴露。 所以查依赖要分两轮:先是编译工具,再是运行时功能依赖。

cl 这个命令要特别说明: 它是 MSVC 的编译器,本身装了 VS 就有,但它不在系统 PATH 里。 它只在「开发者命令提示符」那个窗口里才可用。 在普通 cmd 里敲 cl,报的是「找不到命令」,不是「版本不对」。

三、真解析 CMakeLists:九个开关、五个产物

ZLMediaKit 的可选功能全是 option(),产物全是 add_executable()。 把这两类行抠出来,就知道能配什么、能编出什么。

九个开关的默认值分布很说明问题: HLS、MP4、RTPPROXY、FFMPEG、测试、播放器默认开, WebRTC、SRT、C API 默认关。 和 SRS 一样,扩展功能要显式开。

五个可执行文件里,日常只跑 MediaServer。 另外四个是示例与工具:test_httpApi 演示调接口, test_pusher 演示推流,test_server 是最小服务器, test_benchmark 是压测。 第一次编完先只看 MediaServer.exe 在不在,别被一堆 exe 搞晕。

四、动手 Demo:Windows 编 ZLMediaKit——工具链先查

先把要的命令逐个查一遍,再从 CMakeLists 里抠出开关与产物。 这两件事做完,再动手编就不会卡在半路。

need = [("cmake", ["--version"]), ("git", ["--version"]),
        ("openssl", ["version"]), ("cl", []), ("nasm", ["-v"])]

for cmd, args in need:
    if shutil.which(cmd) is None:
        print(cmd, "没有")
    else:
        print(cmd, "有", version_of(cmd, args))

# 从 CMakeLists 里抠 option() 与 add_executable()
def cmake_scan(text):
    opts, exes = [], []
    for line in text.splitlines():
        s = line.strip()
        m = re.match(r"option\(\s*(\w+)\s+\"[^\"]*\"\s+(ON|OFF)", s)
        if m:
            opts.append((m.group(1), m.group(2)))
            continue
        m = re.match(r"add_executable\(\s*(\w+)", s)
        if m:
            exes.append(m.group(1))
    return opts, exes

opts, exes = cmake_scan(CMAKE)
print(len(opts), "个开关,", len(exes), "个可执行文件")

实跑输出:

--------------------------------------------------------------------
Windows 编 ZLMediaKit——工具链先查
--------------------------------------------------------------------
**① Windows 上编它,缺一样就卡住**

  **ZLMediaKit 用 CMake 构建,不提供现成的 vs 工程文件。**
  **所以第一次编之前在 Windows 上要准备四样:**

  要什么          作用                   缺了会怎样
  ----------------------------------------------------------------------
  CMake 3.10+     生成工程文件           第一步就报找不到命令
  VS 2017+        C++ 编译器与运行库     生成失败,报找不到编译器
  OpenSSL         HTTPS 与 DTLS          能编过,但 TLS 相关功能没有
  libsrtp         WebRTC 的加密媒体      开了 WebRTC 才需要

  **四样里前三样是必装,第四样只在 `ENABLE_WEBRTC=ON` 时要。**
  **这也是「编不过」和「编过了但用不了」的分界:**
  **前者是工具链问题,后者是可选依赖没装。**

**② 真查一遍这台机器的工具链**

  **把编 ZLMediaKit 要的命令逐个查,缺的标出来。**

  命令        有没有     版本
  -----------------------------------------------------------
  cmake       没有       -
  git         有         git version 2.55.0.windows.3
  openssl     有         OpenSSL 3.5.7 9 Jun 2026 (Libr..
  cl          没有       -
  nasm        没有       -

  **五个命令里缺了 3 个。**
  **这台机器上能跑的只有 git 与 openssl,两个编译器一个都没有。**
  **所以「在这台机器上编 ZLMediaKit」这件事,第一步就过不去。**

  **`cl` 是 MSVC 的编译器,它不在 PATH 里很正常:**
  **它只在「开发者命令提示符」那个窗口里才有。**
  **在普通 cmd 里敲 `cl`,报的是找不到命令,不是版本不对。**

**③ 真解析 CMakeLists:开关与产物**

  **ZLMediaKit 的可选功能全是 `option()`,产物全是 `add_executable()`。**
  **把这两类行抠出来,就知道能配什么、能编出什么。**

  开关                默认     说明
  -------------------------------------------------------
  ENABLE_HLS          ON       默认开,不想要得显式关
  ENABLE_MP4          ON       默认开,不想要得显式关
  ENABLE_RTPPROXY     ON       默认开,不想要得显式关
  ENABLE_WEBRTC       OFF      默认关,要用得显式开
  ENABLE_SRT          OFF      默认关,要用得显式开
  ENABLE_CAPI         OFF      默认关,要用得显式开
  ENABLE_TESTS        ON       默认开,不想要得显式关
  ENABLE_PLAYER       ON       默认开,不想要得显式关
  ENABLE_FFMPEG       ON       默认开,不想要得显式关

  **9 个开关里 6 个默认开、3 个默认关。**

  可执行文件         干什么
  ---------------------------------------------------
  MediaServer        服务器本体,这才是要跑的那个
  test_httpApi       用 HTTP 接口查状态的例子
  test_pusher        读 mp4 往里推流的例子
  test_server        最小服务器例子
  test_benchmark     压测工具

  **一共 5 个可执行文件,但日常只用第一个。**
  **其余四个是示例与工具,编出来是给你看代码怎么用的。**
  **第一次编先只看 `MediaServer.exe` 有没有生成,别被一堆 exe 搞晕。**

五个命令里缺了三个:cmake、cl、nasm 都没有。 能跑的只有 git 与 openssl,所以这台机器上编不了。 九个开关里六个默认开、三个默认关,和 SRS 的取向一致。 五个可执行文件里只有 MediaServer 是要跑的,其余全是示例。

30 秒实验

  1. 在「开发者命令提示符」里敲 cl,猜会怎样——能出版本号,因为那个窗口才注入了 VS 的环境变量。
  2. 把 ENABLE_WEBRTC 改成 ON 但没装 libsrtp,猜哪一步报错——编译期报找不到头文件,不是 cmake 阶段。
  3. 跳过 git submodule update,猜报什么——找不到 ZLToolKit/Util/logger.h,编到一半才停。

常见误区

  1. 「装了 VS 就能直接用 cl」——要开开发者命令提示符。
  2. 「CMake 会自己编译」——它只生成工程文件,编译是 VS 干的。
  3. 「开关全开最好」——多一个开关就多一份依赖与构建时间。
自测三问(点开对答案) 1. ZLMediaKit 用什么构建系统? —— **CMake**,不提供现成的 VS 工程文件。 2. `cl` 为什么在普通 cmd 里找不到? —— **它只在开发者命令提示符里注入 PATH**,普通 cmd 没有那套环境变量。 3. 五个可执行文件里日常跑哪个? —— **`MediaServer`**,其余是示例与工具。

相关笔记