windows 11编译zlmediakit

之前做了一个 GB28181的轻量平台,但是要想安装程序需要一点容器之类的操作经验,在使用上确实有点不太方便。因此我就想着把程序做成用户双击 直接使用的模式。 为了实现这个目的,需要在 windows 上编译 zlmediakit。
本文档介绍如何在 Windows 11 环境下编译 ZLMediaKit。
由于在按照官方教程编译时出现了几个错误,并且文档有些地方写的不清不楚的,我觉得有必要更新写一篇文档补充下。
请跟随步骤一步一步操作。

1. 环境准备

在开始编译之前,请确保你的开发环境已安装以下软件:

  • Visual Studio: VS2022(需安装 C++ 桌面开发组件)。
  • Git: 用于克隆代码仓库。

我进行编译时使用的是 Windows11系统,VS2022。 编译过程中无需打开 vs2022。只要 powershell 以及 x64 Native Tools Command Prompt for VS 2022。

2. 获取代码

打开命令行工具(CMD 或 PowerShell),执行以下命令克隆代码并初始化子模块:

1
2
3
4
5
6
7
8
# 克隆主仓库
git clone https://github.com/ZLMediaKit/ZLMediaKit.git

# 进入目录
cd ZLMediaKit

# 初始化子模块 (重要,否则编译会失败)
git submodule update --init --recursive

我当前编译的是 2026/3/1 日的最新 master 分支代码。


3、基于 scoop + vcpkg 的 Windows 版编译

注意: 以下是 zlmediakit 官网关于 windows编译的内容,我对其中进行了部分修改保证编译能成功。

以下为基于 scoop + vcpkg 编译 ZLMediaKit 的一种方式。

  • scoop: Windows 命令行下使用的软件包安装管理工具
  • vcpkg: 微软发起的 C++ 库管理器,其中有大量常用开源库

由于可以在命令行下使用,可以非常方便的进行自动化集成,推荐大家试用。

⚠️ 注意

  • 以下所有操作如无特殊说明均需在 PowerShell 命令行下进行

4、基于 scoop 及 vcpkg 安装编译依赖

4.1 下载安装 scoop 并使用 scoop 安装依赖工具

说明: 直接在 powershell 中执行下面的命令即可,该步骤中很少出错。

以下是为了安装依赖工具 cmakeninja(可选,但建议安装),如已安装,可跳过。

具体可参考其官网说明,以下仅列出相关简要步骤:

  1. **设置环境变量 SCOOP**,用于配置 scoop 的下载安装目录(包括其管理的软件包):

    1
    $env:SCOOP = 'C:\work\develop\scoop'
  2. 为当前用户设置允许执行 PowerShell 脚本:

    1
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
  3. 安装 scoop:

    1
    iwr -useb get.scoop.sh | iex
  4. scoop 添加 extras 软件仓库:

    1
    scoop bucket add extras
  5. 安装 cmakeninja:

    1
    scoop install cmake ninja

💡 提示:为方便后续使用,需将 C:\work\develop\scoop 设置到环境变量 SCOOP 中,将 C:\work\develop\scoop\shims 追加到环境变量 PATH 中。

env

env

4.2 下载配置 vcpkg 并使用 vcpkg 安装依赖库

以下是为了安装相关依赖库,具体包括:openssl 以及 libsrtp,其他可选依赖(如:ffmpeg)也应可安装,暂未测试。

vcpkg 具体使用可参考:

  1. **下载 vcpkg**,其中包括各种配置脚本以及开源库的编译脚本,下载路径假设为 C:\work\develop:

    1
    git clone https://github.com/microsoft/vcpkg
  2. 下载预编译的 vcpkg 包管理工具:

    1
    .\vcpkg\bootstrap-vcpkg.bat -disableMetrics
  3. 编译 openssl:

    1
    .\vcpkg\vcpkg.exe install --triplet=x64-windows-static openssl
  4. **编译 libsrtp**(需要 ENABLE_OPENSSL):

    编辑 C:\work\develop\vcpkg\ports\libsrtp\portfile.cmake,修改 vcpkg_configure_cmake 为如下:(注意 下面配置修改成了当前版本的内容)

    1
    2
    3
    4
    5
    6
    7
    8
    vcpkg_cmake_configure(
    SOURCE_PATH "${SOURCE_PATH}"
    OPTIONS
    "-DCMAKE_PROJECT_INCLUDE=${CMAKE_CURRENT_LIST_DIR}/cmake-project-include.cmake"
    -DLIBSRTP_TEST_APPS=OFF
    -DENABLE_OPENSSL:BOOL=ON
    ${FEATURE_OPTIONS}
    )
    1. 然后进行编译(官方方法):

      1
      .\vcpkg\vcpkg.exe install --triplet=x64-windows-static libsrtp
    2. 或者 (后期我使用的方法)

      1
      .\vcpkg\vcpkg.exe install "libsrtp[openssl]:x64-windows-static"

    说明 : 我成功使用 1 步骤编译了 程序,但是程序在后面的使用中发现 webrtc 有问题,最后查找原因发现可能是 openssl 同 libsrtp 兼容的问题。我先是用的官方方法编译的 libsrtp ,后面使用上面的命令重新编译了 libsrtp 才正常。

    1
    2
    3
    # 先卸载,再重新安装
    .\vcpkg\vcpkg.exe remove libsrtp:x64-windows-static --recurse
    .\vcpkg\vcpkg.exe install "libsrtp[openssl]:x64-windows-static"

5、编译 ZLMediaKit

从开始菜单中打开 VS2022 的开发者命令行模式(x64 Native Tools Command Prompt for VS 2022)。默认未找到基于 PowerShell 的 x64 位版本,可先使用 cmd 版本,然后执行 powershell 切换到 PowerShell。

tools

tools

5.1 修改 CMakeLists.txt

在文件里搜索: OPENSSL_LIBRARIES ,将内容修改成下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查找 openssl 是否安装
# find openssl installed
find_package(OpenSSL QUIET)
if(OPENSSL_FOUND AND ENABLE_OPENSSL)
message(STATUS "found library: ${OPENSSL_LIBRARIES}, ENABLE_OPENSSL defined")
include_directories(${OPENSSL_INCLUDE_DIR})
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_OPENSSL)
update_cached_list(MK_LINK_LIBRARIES ${OPENSSL_LIBRARIES})
if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND OPENSSL_USE_STATIC_LIBS)
update_cached_list(MK_LINK_LIBRARIES ${CMAKE_DL_LIBS})
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
# Windows 下 OpenSSL(尤其是 vcpkg 静态库)会依赖 CryptoAPI
update_cached_list(MK_LINK_LIBRARIES Crypt32)
# 下面 WIN32 分支里已经有 WS2_32,这里不加也行
# update_cached_list(MK_LINK_LIBRARIES ws2_32)
endif()
else()
set(ENABLE_OPENSSL OFF)
set(ENABLE_WEBRTC OFF)
message(WARNING "openssl 未找到, rtmp 将不支持 flash 播放器, https/wss/rtsps/rtmps/webrtc 也将失效")
endif()

主要是替换成下面的脚本,其它不动(每个zlm版本可能都不太一样,需要注意修改的地方):

1
2
3
4
5
6
7
8
if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND OPENSSL_USE_STATIC_LIBS)
update_cached_list(MK_LINK_LIBRARIES ${CMAKE_DL_LIBS})
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
# Windows 下 OpenSSL(尤其是 vcpkg 静态库)会依赖 CryptoAPI
update_cached_list(MK_LINK_LIBRARIES Crypt32)
# 下面 WIN32 分支里已经有 WS2_32,这里不加也行
# update_cached_list(MK_LINK_LIBRARIES ws2_32)
endif()

5.1 执行编译命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在zlmediakit 源码根目录下执行下面的命令。执行前请确保下载了 zlm 的源码,并且执行了 git submodule update --init --recursive
mkdir build
cd build

$VCPKG_CMAKE = 'C:\work\develop\vcpkg\scripts\buildsystems\vcpkg.cmake'
$VCPKG_INSTALL_PATH = 'C:\work\develop\vcpkg\installed\x64-windows-static'

$CMAKE_OPTIONS = @(
"-GCodeBlocks - Ninja"
"-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo"
"-DCMAKE_C_COMPILER:STRING=cl.exe"
"-DCMAKE_CXX_COMPILER:STRING=cl.exe"
"-DCMAKE_TOOLCHAIN_FILE:FILEPATH=$VCPKG_CMAKE"
"-DCMAKE_PREFIX_PATH:FILEPATH=$VCPKG_INSTALL_PATH"
"-DVCPKG_TARGET_TRIPLET:STRING=x86-windows-static"
"-DENABLE_WEBRTC:BOOL=ON"
)

cmake .. @CMAKE_OPTIONS
cmake --build . --target all

编译成功后,源码目录下多一个 release 目录,编译的程序在里面。
发布

6、运行

C:\work\develop\ZLMediaKit\release\windows\RelWithDebInfo 目录直接双击运行 MediaServer.exe 即可。

运行

只要复制 MediaServer.exe , MediaServer.exe , www目录,到其它位置,就可以使用基本的功能。

发布

7、问题

问题1:webrtc 显示 openssl 问题

原因:openssl 与 libsrtp 兼容有问题,需要重新编译libsrtp。

1
2
3
# 先卸载,再重新安装
.\vcpkg\vcpkg.exe remove libsrtp:x64-windows-static --recurse
.\vcpkg\vcpkg.exe install "libsrtp[openssl]:x64-windows-static"