音视频后端计算机视觉【免费下载链接】zoneminderZoneMinder is a free, open source Closed-circuit television software application developed for Linux which supports IP, USB and Analog cameras.项目地址https://gitcode.com/gh_mirrors/zo/zoneminder点击查看免费下载本文是 ZoneMinder 在 macOS 上从源码构建、安装并运行到可用的完整实战指南。它覆盖了从 Xcode 与 Homebrew 前置准备、依赖安装、Perl 模块补齐、CMake 构建参数、运行时目录规划、MariaDB 数据库初始化到 Apache/nginx Web 服务器对接与 launchd 开机自启的完整链路并基于本仓库源码解释了构建与运行中容易踩坑的底层原因如共享内存机制、taint-safe PATH、Web 用户切换逻辑。读完本文你将能在 Apple Silicon 或 Intel Mac 上独立搭建一套可捕获网络摄像头、执行运动检测、录制事件并由 Web 控制台管理的 ZoneMinder 开发/评估环境。覆盖范围能做什么、不能做什么ZoneMinder 在 macOS 上没有提供任何软件包无 Homebrew formula、无 pkg只能从源码手工构建、安装和运行。本仓库的 docs/installationguide/macos.rst 记录的步骤已经在 Apple Silicon 上完整跑通到可工作的系统支持网络源捕获RTSP、HTTP、ONVIF、运动检测、事件落盘录制以及 Web 界面提供控制台服务。请把它当作开发与评估平台而不是直接挂摄像头的生产环境——文章末尾的 Known gaps 一节列出了当前的关键缺口。两个 Prefix 需要区分清楚整个安装过程中存在两个截然不同的安装前缀prefix混淆它们是新手最常见的错误Homebrew 的前缀依赖包的来源。Apple Silicon 上是/opt/homebrewIntel 上是/usr/local。为了让命令在两种架构下都能运行下文统一写成$(brew --prefix)。ZoneMinder 自己的安装前缀与 Homebrew 无关默认在两种架构下都是/usr/local。本文所有路径均基于该默认值。如需改到别处在 configure 时传-DCMAKE_INSTALL_PREFIX参数并同步调整文中的所有路径。本地 USB 摄像头不支持这是预期行为V4L2 是 Linux 专属接口ZoneMinder 在 macOS 上没有对应实现。configure 阶段会报告Could NOT find V4L2这是正常的。根因在 cmake/Modules/FindV4L2.cmake该模块通过查找linux/videodev2.h头文件见find_path(V4L2_VIDEODEV2_INCLUDE_DIR NAMES linux/videodev2.h)来判定 V4L2 支持而 macOS 显然不存在 Linux 头文件。网络摄像头RTSP、HTTP、ONVIF则正常工作——这本来就是 ZoneMinder 最主流的用法。前置条件需要两样基础工具xcode-select --install /bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)第一行安装 Xcode 命令行工具第二行安装 Homebrew。依赖安装构建期依赖brew install \ catch2 ffmpeg gsoap jpeg-turbo mosquitto mysql-client \ nlohmann-json openssl3 pcre2值得注意cmake和pkg-config随命令行工具自带curl来自 SDK这三者都无需安装。逐个说明各依赖的用途catch2构建测试套件对应-DBUILD_TEST_SUITEONffmpeg音视频编解码与转封装src/zm_ffmpeg.cpp 的核心依赖gsoapONVIF 协议栈src/zm_monitor_onvif.cppjpeg-turboJPEG 编解码src/zm_jpeg.cppmosquittoMQTT 支持src/zm_mqtt.cppmysql-client数据库客户端keg-only不会出现在默认 include 路径上这正是后文需要特殊 CFLAGS 的原因nlohmann-jsonJSON 解析openssl3TLS/加密同样 keg-only需要通过OPENSSL_ROOT_DIR显式指定pcre2正则表达式src/zm_regexp.cpp。运行期依赖运行还需要数据库、PHP 和 Web 服务器。macOS 至今仍在/usr/sbin/httpd提供 Apache但自 Monterey 起已不再内置 PHP所以 PHP 无论如何都得从 Homebrew 装brew install mariadb phpPerl 模块最容易干净构建却跑不起来的环节ZoneMinder 的一些 Perl 模块缺失时configure只警告而不报错。这意味着你可能得到一个构建成功、但 Perl 守护进程全部无法工作的系统。文档明确指出两个关键模块和一个数据库驱动Sys::Mmap支撑ZoneMinder::Memory::Mapped。每个 Perl 守护进程都要通过它读取 monitor 状态——没有它zmdc.pl、zmwatch.pl和zmpkg.pl完全看不到你的监控器。Date::Manip被zmfilter.pl、Event.pm和Filter.pm使用负责事件过滤与日期处理。数据库驱动ZoneMinder 优先使用DBD::MariaDB它同时驱动 MariaDB 和 MySQL。为什么-DZM_NO_MMAPON不是绕过 Sys::Mmap 的办法这是个重要的技术坑。ZM_NO_MMAP在 CMakeLists.txt 中定义默认 OFF作用是切换到 SysV 共享内存。但 macOS 把 SysV 共享内存段上限卡在4 MiB/段kern.sysv.shmmax且最多 8 段——单个 1080p RGB 帧就超过一个段的大小。因此内存映射mmap是 macOS 上唯一可行的模式。从源码看mmap 路径由 scripts/ZoneMinder/lib/ZoneMinder/Memory.pm.in 中的ENABLE_MMAP开关决定加载ZoneMinder::Memory::Mapped还是ZoneMinder::Memory::Shared。在 C 侧src/zm_monitor.cpp 中zmc通过mmap(nullptr, mem_size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, map_fd, 0)映射共享内存文件若锁页失败EAGAIN则降级为不带MAP_LOCKED的普通映射。另外注意macOS 没有/dev/shm映射文件落在/usr/local/var/run/zm一个磁盘目录而非 RAM 文件系统因为 macOS 不挂 tmpfs所以磁盘流量会比同等配置的 Linux 高——这是预期现象。方式一推荐使用 Homebrew Perl苹果已弃用其捆绑的 Perl 且迟早移除Homebrew Perl 能让 ZoneMinder 完全脱离系统目录brew install perl cpanminus cpanm --notest Sys::Mmap Date::Manip DBI LWP::UserAgentHomebrew Perl 没有苹果捆绑的任何扩展所以DBI和LWP::UserAgent也必须一并安装。DBD::MariaDB需要特殊处理。它的 configure 阶段会询问mysql_config获取链接参数得到-lzstd -lssl -lcrypto但 Homebrew Perl 的ldflags不带-L$(brew --prefix)/lib检查会以Cant link/include C library zstd, ssl, crypto, aborting失败。需要手动把路径传进去export PATH$(brew --prefix mysql-client)/bin:$PATH cpanm --notest \ --configure-args--libs\-L$(brew --prefix mysql-client)/lib -L$(brew --prefix)/lib -lmysqlclient -lz -lzstd -lssl -lcrypto -lresolv\ --cflags\-I$(brew --prefix mysql-client)/include/mysql\ \ DBD::MariaDB随后让 ZoneMinder 针对该 Perl 配置-DPERL_EXECUTABLE$(brew --prefix)/bin/perl注意安装位置的差异ZoneMinder 自己的模块装入该 Perl 的vendorlib位于$(brew --prefix)/lib/perl5/vendor_perl/version它在 Cellar 之外能跨 Perl 升级存活。但上面cpanm装的 CPAN 模块装在sitelib会解析进带版本的 Cellar 目录Homebrew 一旦升级 Perl 就被清空。升级后需要重装或者按brew info perl说明配置local::lib。方式二使用系统 Perl系统 Perl 需要的模块更少因为苹果捆绑了DBI和LWP::UserAgentsudo cpan Sys::Mmap Date::Manip数据库驱动仍需要且要同样的链接参数。模块装入/Library/Perl/version需要 sudo。构建 ZoneMindercmake -S . -B build \ -DCMAKE_BUILD_TYPERelease \ -DBUILD_TEST_SUITEON \ -DCMAKE_PREFIX_PATH$(brew --prefix mysql-client);$(brew --prefix) \ -DOPENSSL_ROOT_DIR$(brew --prefix openssl3) \ -DCMAKE_C_FLAGS-I$(brew --prefix mysql-client)/include \ -DCMAKE_CXX_FLAGS-I$(brew --prefix mysql-client)/include cmake --build build -j$(sysctl -n hw.ncpu)mysql-client相关的参数不是可选项。Homebrew 将该 formula 设为 keg-only默认不在 include 路径上CMakeLists.txt里裸的find_library调用找不到它的头文件。省掉这些参数构建会在mysql/mysql.h file not found处停下。构建完成后可以运行测试套件验证。注意必须在tests目录下运行因为字体测试按相对路径加载 fixtures工作目录错了测试会失败cd build/tests ./tests ~[notCI]安装与目录规划sudo cmake --install build使用默认前缀时安装结果分布如下内容路径二进制/usr/local/binWeb 文件/usr/local/share/zoneminder/wwwCGI/usr/local/libexec/zoneminder/cgi-bin配置/usr/local/etc/zmPerl 模块/Library/Perl/version运行时目录必须手工创建没有任何机制会替你创建这些目录。Linux 上由发行版软件包负责macOS 上你得自己一次性建好sudo mkdir -p /usr/local/var/run/zm \ /usr/local/var/log/zm \ /usr/local/var/cache/zoneminder/temp \ /usr/local/var/lib/zoneminder/events sudo chown -R _www:_www /usr/local/var/run/zm \ /usr/local/var/log/zm \ /usr/local/var/cache/zoneminder \ /usr/local/var/lib/zoneminder_www是 macOS 运行 Web 服务器的账户也是 configure 自动检测到的账户。关键约束ZoneMinder 必须以 Web 用户身份启动无论选哪个账户ZoneMinder 都必须以该账户启动。zmpkg.pl会比较当前用户与ZM_WEB_USER该配置在 zm.conf.in 中定义注释明确写着 Username and group that web daemon (httpd/apache) runs as不一致时依次尝试sudo -u、两种su形式切换身份。从源码 scripts/ZoneMinder/lib/ZoneMinder/General.pm 的getCmdFormat可以看到完整逻辑先用getpwuid( $ )取得当前用户若等于ZM_WEB_USER则直接返回空前缀否则依次探测sudo -u user、su -s /bin/sh user -c 、su user -c 三种语法。以你自己的账户运行而配置用户是_www时三种方式全部失败——su需要 rootsudo要密码——最终报Unable to find valid su syntax并exit -1。Linux 上 systemd 通过以 Web 用户身份启动 unit 绕开了这个问题下面的 launchd 任务也是同样思路。因此有两种可行方案用 launchd 启动见后文由 launchd 以_www身份拉起任务工作站式简化方案把 zm.conf 里的ZM_WEB_USER和ZM_WEB_GROUP改成你自己的账户和组让以你身份运行的 Web 服务器指向它并把上面的目录都归你所有。无论哪种方案zmsCGI 流服务读取zmc采集进程写入的映射内存所以采集守护进程与 Web 服务器必须就同一账户达成一致。数据库初始化Homebrew 的 MariaDB 用unix_socket插件认证root所以mysql -u root会被拒绝——只有操作系统的 root 用户能匹配。你自己的账户反而得到一个管理员账户这正是不加-u直接跑mariadb时使用的账户brew services start mariadb mariadb /usr/local/share/zoneminder/db/zm_create.sql mariadb -e CREATE USER IF NOT EXISTS zmuserlocalhost IDENTIFIED BY zmpass; mariadb -e GRANT LOCK TABLES, ALTER, SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX ON zm.* TO zmuserlocalhost; zmupdate.pl --nointeractive数据库结构定义文件源位于 db/zm_create.sql.in含版本升级脚本目录 db/。部署到任何可被外部访问的环境前务必把上面的默认用户名zmuser/密码zmpass改掉——包括授权语句和 zm.conf 里的ZM_DB_USER/ZM_DB_PASS。Apple Silicon 上zmupdate.pl的经典坑zmupdate.pl做 schema 变更时不用 DBI而是直接调用客户端二进制scripts/ZoneMinder/lib/ZoneMinder/General.pm 的findDbCommand会优先选mariadb找不到再退回mysql。Perl 脚本以-Ttaint 模式运行并把PATH硬编码为/bin:/usr/bin:/usr/local/bin见 scripts/zmupdate.pl.in。问题来了Apple Silicon 上 Homebrew 前缀是/opt/homebrew不在这个 taint-safe PATH 里两个客户端都找不到升级会以sh: mysql: command not found失败。在该 PATH 可配置之前有两个临时解法在 scripts/zmupdate.pl.in 顶部附近的$ENV{PATH}行手动追加 Homebrew 前缀或把mariadb软链进/usr/local/bin。这个 PATH 之所以危险是因为 Perl 的 taint 检查会拒绝任何组/全局可写的目录。相关逻辑见 CMakeLists.txt默认路径是/bin:/usr/bin:/usr/local/bin若找到了mariadb/mysql客户端且其目录安全只有 owner 可写会自动追加到ZM_SCRIPT_PATH——而 Homebrew 的bin是组可写的所以不会被自动添加这正是 Apple Silicon 上会踩坑的根源。Web 服务器配置构建会在build/misc/下生成 Apache 和 nginx 两个起点配置源模板分别为 misc/apache.conf.in 和 misc/nginx.conf.in已替换好你配置的路径。它们是指引而非开箱即用的配置——两个文件都不会被安装都需要根据你的 Web 服务器实际情况改造。无论选哪个都需要三样东西PHP、为nph-zms开启 CGI、为 API 配置 rewrite 规则。示例文件展示了全部三项。从 misc/apache.conf.in 可见 Apache 版的关键结构ScriptAlias /cgi-bin CGI_PREFIX配ExecCGI直接执行 CGI/zm/api目录段配置了 CakePHP 风格的三层 rewrite。CGI 能力决定了哪个服务器更省事zms是 CGI 二进制Apache 用mod_cgi直接跑nginx 不行需要fcgiwrap之类的包装器而Homebrew 不打包 fcgiwrap。用 nginx 且没有包装器时界面能加载、控制台能工作但直播流和事件回放不可用这正是 misc/nginx.conf.in 中location /cgi-bin-zm段用fastcgi_pass unix:/run/fcgiwrap.sock的原因。示例文件还是按 Linux 布局写的macOS 上需要修改nginx 版期待/etc/pki下的证书、/etc/nginx下的fastcgi_params、/run/fcgiwrap.sock的 socket——macOS 上这三样都不存在。启动 ZoneMinder没有 systemd 时zmpkg.pl会回退到zmdc.pl所以可以手工启停sudo zmpkg.pl start sudo zmpkg.pl status sudo zmpkg.pl stoplaunchd 开机自启构建会生成 launchd 任务 misc/com.zoneminder.zoneminder.plist.in构建产物在build/misc/com.zoneminder.zoneminder.plist路径和 Web 用户已填充好。拷贝就位并加载sudo install -o root -g wheel -m 644 \ build/misc/com.zoneminder.zoneminder.plist /Library/LaunchDaemons/ sudo launchctl load -w /Library/LaunchDaemons/com.zoneminder.zoneminder.plist理解这个任务的设计很重要模板文件注释里写得很清楚任务只负责启动 ZoneMinder不负责监督。zmpkg.plfork 出zmdc.pl后就返回——正是 systemd 的Typeforking形状——之后由zmdc.pl和zmwatch.pl自己重启采集与分析守护进程。launchd 的工作只是开机跑这一次。卸载unload不会停掉 ZoneMinder因为 launchd 没有ExecStop的对应物。必须先停再卸sudo zmpkg.pl stop sudo launchctl unload -w /Library/LaunchDaemons/com.zoneminder.zoneminder.plist模板中的AbandonProcessGroup键是必须的zmpkg.plfork 完守护进程就退出若没有该键launchd 会把退出当作任务结束杀掉进程组里所有剩余进程——也就是整个 ZoneMinder。同样没有 systemd unit 的After/Requires对应物。launchd 只对它自己管理的任务排序Homebrew MariaDB 不在其列所以开机时 ZoneMinder 可能先于数据库就绪而启动。zmdc.pl会重试但若 monitor 意外处于 idle 状态去查zmdc.log。已知缺口Known gaps文档如实列出了当前 macOS 支持的真实边界这些也是评估能否用于生产的关键信息无 Homebrew formula没有brew services集成上面的 launchd 任务只能手工加载仅支持源码安装无日志轮转misc/logrotate.conf.in 是写给 logrotate 的postrotate 里调用BINDIR/zmpkg.pl logrot而 macOS 用的是newsyslog且未提供任何配置无本地摄像头支持见文首说明libunwind、libVLC、libVNC默认找不到三者都是可选项其中libunwind只影响崩溃日志里的 backtrace 详细程度configure 会警告找不到arp-scan和ip均非致命。brew install arp-scan可解决前者ip是 Linux 工具macOS 无对应物因此 monitor 探测能力略弱Perl 脚本的 taint-safe PATH 硬编码/bin:/usr/bin:/usr/local/bin出现在十七个文件中scripts/zmpkg.pl.in、scripts/zmdc.pl.in、scripts/zmfilter.pl.in 等任何被它们 shell out 的程序都必须在这几个目录里。Apple Silicon 的/opt/homebrew不在其中——这正是上面zmupdate.pl失败的根源Linux 上用--prefix/opt安装也会遇到同样问题Sys::CPU已从 CPAN 移除无法安装而 scripts/zmtelemetry.pl.in 依赖它。受影响的只有遥测功能。快速故障排查指引结合源码将本文反复出现的坑归纳为一张速查表现象根因解法构建报mysql/mysql.h file not foundmysql-client keg-only不在 include 路径保留CMAKE_C_FLAGS/CXX_FLAGS与CMAKE_PREFIX_PATH参数Perl 守护进程看不到 monitor缺Sys::Mmapcpanm Sys::MmapHomebrew Perl或sudo cpan Sys::Mmap系统 Perl启动报Unable to find valid su syntax当前用户 ≠ZM_WEB_USER且 sudo/su 均不可用用 launchd 以 Web 用户启动或把ZM_WEB_USER改成当前账户zm.conf.inzmupdate.pl报sh: mysql: command not foundtaint-safe PATH 不含/opt/homebrew/bin手工修改$ENV{PATH}或软链mariadb到/usr/local/binnginx 下直播流不可用zms是 CGInginx 缺 fcgiwrap 包装器换 Apachemod_cgi原生支持或自行安装 fcgiwrap开机后 monitor 意外 idlelaunchd 无法对 Homebrew MariaDB 排序启动早于数据库查zmdc.log确认 DB 就绪后由zmdc.pl重试这套从构建、安装到运行的完整流程加上上述每个坑的源码级根因分析足以支撑你在 macOS 上把 ZoneMinder 从零部署到可用的监控平台。赞分享音视频后端计算机视觉【免费下载链接】zoneminderZoneMinder is a free, open source Closed-circuit television software application developed for Linux which supports IP, USB and Analog cameras.项目地址https://gitcode.com/gh_mirrors/zo/zoneminder点击查看免费下载相关推荐ZoneMinder 在 Ubuntu 上的安装部署完全指南apt/PPA 安装、数据库配置与源码打包实战ZoneMinder 在 Ubuntu 上的安装部署完全指南apt/PPA 安装、数据库配置与源码打包实战 本指南基于 ZoneMinder 官方安装文档音视频后端计算机视觉在 Ubuntu 服务器上从源码构建与部署 Apache OpenWhisk 实战指南在 Ubuntu 服务器上从源码构建与部署 Apache OpenWhisk 实战指南 Apache OpenWhisk 是一个开源的无服务器serverle云原生后端微服务ZoneMinder 多服务器Multi-Server安装部署指南共享数据库与共享存储架构实战ZoneMinder 多服务器Multi Server安装部署指南共享数据库与共享存储架构实战 本指南以 ZoneMinder 官方安装文档 docs/i音视频后端计算机视觉上一篇免费完整指南4 步快速激活 Windows 和 Office去除未激活水印下一篇怎样高效采集抖音视频开源批量下载工具的完整解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考