☰
ZLMediaKit Windows免编译部署实战指南
2026/10/15 17:14:48 网站建设 项目流程

简介:本资源是ZLMediaKit在Windows平台的开箱即用型流媒体服务包,面向流媒体初学者、WebRTC/RTMP开发工程师及需要快速搭建本地测试环境的技术人员,解决传统编译部署门槛高、环境配置复杂等痛点。压缩包共86个文件,133.23MB,包含6个核心exe可执行程序(如MediaServer.exe、test_bench_pull.exe)、15个JS前端交互脚本(含ZLMRTCClient.js及配套map文件)、9个lib静态库与动态链接库(zlmediakit.lib、mk_api.dll等)、配置文件(config.ini)、证书(default.pem)及HTML/Swagger文档,完整覆盖服务启动、推拉流测试、WebRTC调试与API调用全流程。已有537人学习下载,资源结构清晰,Debug目录下已预置全部运行依赖,双击即可启动高性能流媒体服务,无需安装VS或CMake,特别适合教学演示、功能验证与轻量级私有直播场景快速落地。

1. ZLMediaKit-Windows-Release(免编译双击exe文件即可启动):不是“开箱即用”的幻觉,而是Windows端流媒体服务落地的最小可行路径

你刚在GitHub上搜到ZLMediaKit-Windows-Release,点进仓库看到一行加粗描述:“免编译、双击exe即可启动”——心里一热,立刻下载解压,双击ZLMediaKit.exe,黑窗闪一下就没了。你懵了:没报错,没日志,没网页,连个端口都没占。这不是bug,是ZLMediaKit在Windows下默认以服务模式静默运行的合理设计,而绝大多数新手卡在这第一秒,误以为“失败”,转头去折腾VS编译、CMake配置、OpenSSL链接……白耗三天。这个Release包本质不是玩具,而是面向生产环境轻量部署的Windows原生流媒体服务二进制分发形态:它不依赖Visual Studio运行时(已静态链接)、不强制要求管理员权限(但推拉流需放行防火墙)、默认监听0.0.0.0:80和0.0.0.0:1935,却把最关键的配置入口藏在conf/目录里。适合谁?适合需要快速验证RTMP/HLS/WebRTC推拉流链路的嵌入式方案工程师、安防设备对接人员、教育类直播系统原型开发者——他们不要源码调试,只要“改两行配置,三分钟让摄像头画面出现在浏览器里”。本文不讲C++编译原理,只带你用这个Release包,在Windows 10/11上跑通从推流→转协议→拉流→验证的全链路,每一步都对应真实操作、可截图复现、失败有回溯点。


2. 用ZLMediaKit-Windows-Release在本地跑通RTMP推流与HLS播放:从解压到看到画面的6个确定性步骤

ZLMediaKit的Windows Release包不是绿色软件,它是一套带完整服务生命周期管理的流媒体后端。所谓“双击即启”,实则是启动一个Windows控制台程序,该程序会读取配置、初始化网络模块、加载插件(如HLS生成器),然后转入后台监听状态。关键在于:它不弹GUI,不建桌面图标,不写注册表,所有行为由配置文件驱动。下面步骤基于官方最新Release(v4.0+,2024年Q2稳定版),全程无需管理员权限(除端口绑定外),适用于Windows 10 22H2及以上系统。

2.1 下载、解压与目录结构确认:认准conf/和www/两个生命线目录

从GitHub Releases页面下载形如ZLMediaKit-Windows-Release-20240415.zip的压缩包(注意:不要下载Source code),解压到纯英文路径,例如D:\zlm\。解压后必须存在以下结构:

D:\zlm\ ├── ZLMediaKit.exe ← 主程序(无GUI,控制台窗口仅闪现) ├── conf\ ← 配置核心:所有服务行为由此定义 │ ├── config.ini ← 主配置(必须存在,不可重命名) │ └── plugin.ini ← 插件开关(HLS/WebRTC等在此启用) ├── www\ ← Web服务根目录:HLS切片、HTTP API、WebRTC前端均从此提供 │ ├── index.html ← 默认首页(含简易推拉流测试页) │ └── hls\ ← HLS.m3u8及.ts切片自动生成至此 └── logs\ ← 日志自动创建(首次运行后出现)

提示:若解压后无conf/或www/,说明下载的是错误包(常见于误点“Assets”里的src.zip)。正确包大小通常在15~25MB之间,含ZLMediaKit.exe文件且其属性中“详细信息”页显示“公司名称”为ZLMediaKit Project。

2.2 修改config.ini:放开HTTP API与HLS服务,这是让服务“可感知”的第一步

conf/config.ini是ZLMediaKit的中枢神经。默认配置为最小化安全策略:HTTP API关闭、HLS禁用、仅监听本地回环地址。我们需要显式开启外部访问能力。用记事本打开conf/config.ini,定位并修改以下三处(其他保持默认):

[http] # 启用HTTP服务器(提供API、HLS索引、Web界面) enable=1 # 监听所有网卡,而非仅127.0.0.1(否则局域网设备无法访问) address=0.0.0.0 # HTTP端口(默认80,若被占用可改为8080) port=80 [rtp] # RTSP/RTMP推流监听地址(同理,需设为0.0.0.0才能接收局域网推流) address=0.0.0.0 [hls] # 启用HLS协议生成(关键!否则推流后无.m3u8文件) enable=1 # HLS切片存放路径(必须指向www/hls,否则播放器找不到) path=../www/hls/

参数说明:

  • address=0.0.0.0是Windows下跨设备访问的前提,它告诉ZLMediaKit绑定到所有IPv4接口;
  • path=../www/hls/中的..表示相对conf/目录向上一级,再进入www/hls/,这是硬编码路径规则,不可写成绝对路径;
  • 若修改port=8080,后续所有URL中的端口需同步替换(如http://localhost:8080/)。

2.3 启用HLS插件:在plugin.ini中激活hls.so(Windows下为hls.dll)

ZLMediaKit采用插件化架构,HLS功能并非内置,而是通过动态库加载。conf/plugin.ini控制插件开关。打开该文件,找到[hls]段落,确保enable=1且path指向正确的DLL:

[hls] enable=1 # Windows下插件为.dll文件,Release包已自带,路径为相对conf/的子目录 path=./plugins/hls.dll

注意:./plugins/hls.dll中的.代表conf/目录本身,因此实际DLL文件位于D:\zlm\conf\plugins\hls.dll。若该路径下无此文件,请检查下载包完整性——缺失插件将导致HLS功能完全不可用,且无任何错误提示。

2.4 双击启动并验证服务存活:用netstat和curl确认端口监听与基础响应

完成配置后,不要双击ZLMediaKit.exe—— 这会导致控制台窗口闪退,无法观察日志。正确做法是:

  1. 以管理员身份运行cmd(仅首次需管理员,因绑定80端口需提升权限);
  2. 切换到D:\zlm\目录:cd /d D:\zlm;
  3. 执行:ZLMediaKit.exe -d(-d参数表示守护模式,输出日志到控制台);

此时窗口应持续显示日志,首行类似:

[2024-04-15 10:23:45.123] [INFO] [12345] [MediaServer.cpp:123] MediaServer started on 0.0.0.0:1935, 0.0.0.0:554, 0.0.0.0:80...

立即验证端口是否就绪:

# 检查80(HTTP)和1935(RTMP)端口是否LISTEN netstat -ano | findstr ":80\|:1935" # 应返回类似: TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 12345 # 其中12345为ZLMediaKit进程PID # 用curl测试HTTP基础响应(需提前安装curl,或用浏览器访问 http://localhost/) curl -I http://localhost/ # 应返回:HTTP/1.1 200 OK 及 Server: ZLMediaKit 字样

逻辑说明:-d参数让ZLMediaKit在前台运行并打印实时日志,这是调试阶段唯一可靠的启动方式;netstat验证网络层就绪,curl -I验证HTTP服务层响应,二者缺一不可。若netstat无输出,说明进程未成功绑定端口(常见于端口被占用或配置语法错误);若curl超时,则可能是防火墙拦截或address未设为0.0.0.0。

2.5 推流测试:用OBS向ZLMediaKit发送RTMP流,触发HLS切片生成

现在服务已就绪,我们用OBS Studio(免费开源)作为推流端。OBS设置要点:

  • 服务:选择“自定义”;
  • 服务器:rtmp://127.0.0.1/live(推流到本地);
  • 流密钥:test(任意字符串,ZLMediaKit默认接受所有密钥);
  • 视频编码:H.264,CBR,码率≤2000kbps(避免高码率导致切片延迟);
  • 音频编码:AAC,44.1kHz。

启动OBS推流后,观察ZLMediaKit控制台日志:

[2024-04-15 10:28:33.456] [INFO] [12345] [RtmpSession.cpp:789] RTMP publish: rtmp://127.0.0.1/live/test [2024-04-15 10:28:33.457] [INFO] [12345] [HlsMaker.cpp:212] HLS stream created: live/test

同时检查www/hls/目录:应自动生成live_test.m3u8文件及.ts切片(如live_test-1.ts,live_test-2.ts)。若目录为空,说明HLS插件未生效或path配置错误。

2.6 播放验证:用VLC或浏览器直接打开HLS地址,看到实时画面

HLS播放地址格式固定:http://<服务器IP>/hls/<应用名>_<流密钥>.m3u8。本例中:

  • 本地播放:http://localhost/hls/live_test.m3u8
  • 局域网其他设备播放:http://192.168.1.100/hls/live_test.m3u8(将192.168.1.100替换为你的Windows主机IP)

在Chrome/Firefox中直接粘贴URL,应自动加载HLS播放器(现代浏览器原生支持);或用VLC打开网络串流(Media → Open Network Stream),输入相同URL。画面延迟通常在3~8秒,属HLS协议正常范围。若播放失败:

  • 检查浏览器控制台(F12)是否有CORS错误(ZLMediaKit默认允许跨域,无需额外配置);
  • 检查www/hls/下文件是否生成(无文件则推流未触发HLS);
  • 检查防火墙是否阻止了80端口入站(Windows Defender默认会拦截)。

3. ZLMediaKit-Windows-Release的3个必调参数:为什么改它们、怎么改、不改会怎样

ZLMediaKit的配置看似简单,但三个参数直接影响服务稳定性、兼容性与排错效率。它们不是“可选优化项”,而是Windows环境下绕不开的生存参数。以下按优先级排序,每项均附真实翻车案例。

3.1conf/config.ini中的maxStreamNum:流路数上限,超限后新推流被静默拒绝

现象:OBS推流后ZLMediaKit日志无RTMP publish记录,netstat显示1935端口仍在监听,但www/hls/无新文件生成。
原因:ZLMediaKit默认maxStreamNum=100,但Windows版因资源限制,实际并发流数受系统句柄数影响。当已有99路流在线,第100路推流请求会被内核层丢弃,不写日志、不返回错误码。
解决:在[general]段落中显式设置合理值:

[general] maxStreamNum=50

实测建议:普通i5/8GB内存机器,设为30~50;若仅做单路演示,设为5即可。该值过大会导致内存泄漏风险(Windows版特定),过小则无法支撑多路监控接入。

3.2conf/config.ini中的sslPort与sslEnable:HTTPS与WSS支持开关,WebRTC必开

现象:浏览器访问https://localhost/报“连接被拒绝”,或WebRTC前端(如www/webrtc_player.html)提示Failed to create peer connection。
原因:ZLMediaKit的WebRTC信令依赖HTTPS/WSS(非HTTP/WS),而Release包默认sslEnable=0,且未配置证书。
解决:启用SSL并指定自签名证书路径(Release包已自带):

[http] sslEnable=1 sslPort=443 sslKeyFile=../cert/private.key sslCertFile=../cert/cert.pem

注意:../cert/目录在Release包中存在,含private.key和cert.pem(自签名证书)。若sslPort=443被占用,可改为8443,但前端JS中wss://地址需同步修改。不启用SSL,WebRTC功能完全不可用——这是Windows Release包最隐蔽的“功能锁”。

3.3conf/config.ini中的logLevel与logSize:日志级别与滚动策略,排错唯一依据

现象:服务异常退出,控制台无任何错误信息,logs/目录下只有空文件或旧日志。
原因:默认logLevel=4(INFO级),大量DEBUG信息被过滤;且logSize=10(单位MB)导致日志滚动过快,关键错误被覆盖。
解决:开发调试期设为:

[logger] logLevel=0 # 0=TRACE(最详细),1=DEBUG,4=INFO(默认) logSize=100 # 单个日志文件最大100MB logNum=5 # 保留5个历史日志文件

血泪经验:某次因logLevel=4,ZLMediaKit因openssl.dll版本冲突崩溃,日志只打印MediaServer started...后静默退出。将logLevel调至0后,首行即显示ERROR: SSL library not loaded,直指问题根源。日志是Windows下唯一的“黑匣子”,别吝啬磁盘空间。


4. 常见问题排查:ZLMediaKit-Windows-Release的5个典型翻车现场与解法

Windows平台的特殊性(权限模型、防火墙策略、DLL依赖)让ZLMediaKit Release包比Linux版更易“静默失败”。以下是我在多个客户现场复现并归因的5个高频问题,按发生概率排序,每条均含可执行的诊断命令。

4.1 现象:双击ZLMediaKit.exe后控制台窗口瞬间消失,无任何日志残留

原因:配置文件语法错误(如INI中多了一个空格、缺少[符号)或conf/目录缺失,导致程序加载失败后立即退出。
解决:

  1. 用管理员CMD进入D:\zlm\目录;
  2. 执行ZLMediaKit.exe -c conf/config.ini -d(显式指定配置路径);
  3. 观察控制台输出——若报parse config error at line X,即定位到错误行;
  4. 用Notepad++以“ANSI”编码打开config.ini(Windows记事本UTF-8 BOM可能导致解析失败)。

4.2 现象:netstat显示80端口LISTENING,但curl http://localhost/超时或返回404

原因:www/目录被移动或config.ini中http.wwwPath未指向正确位置(Release包默认无需修改,但用户可能误删www/)。
解决:

  1. 检查D:\zlm\www\index.html是否存在;
  2. 在conf/config.ini中确认[http]段无wwwPath字段(默认即为../www);
  3. 若手动添加过wwwPath,注释掉该行:;wwwPath=../www。

4.3 现象:OBS推流成功(日志有RTMP publish),但www/hls/目录无.m3u8文件

原因:conf/plugin.ini中[hls]段enable=0,或path指向不存在的DLL路径。
解决:

  1. 执行dir conf\plugins\hls.dll,确认DLL存在;
  2. 用ZLMediaKit.exe -d启动,观察日志中是否有load plugin hls success;
  3. 若无此日志,检查plugin.ini中path是否为./plugins/hls.dll(注意是.不是..)。

4.4 现象:局域网手机浏览器访问http://192.168.1.100/hls/live_test.m3u8空白,PC浏览器正常

原因:Windows防火墙阻止了80端口的入站连接(默认只允许本地回环)。
解决:

  1. Win+R →wf.msc打开Windows Defender防火墙高级设置;
  2. 左侧选“入站规则”,右侧点“新建规则”;
  3. 类型选“端口”,协议TCP,特定本地端口80;
  4. 操作选“允许连接”,配置文件选“域、专用、公用”;
  5. 名称填ZLMediaKit_HTTP。

4.5 现象:ZLMediaKit.exe -d启动后日志卡在MediaServer started...,无后续推流日志,且netstat查不到1935端口

原因:杀毒软件(尤其360、腾讯电脑管家)将ZLMediaKit.exe识别为“可疑程序”并拦截网络初始化。
解决:

  1. 临时关闭杀软实时防护;
  2. 重新执行ZLMediaKit.exe -d;
  3. 若成功,将ZLMediaKit.exe及D:\zlm\目录添加到杀软信任区;
  4. 重启服务验证。

提示:此问题在企业内网高频出现,因ZLMediaKit使用非常规网络IO模型,易被启发式引擎误报。


5. 把ZLMediaKit-Windows-Release变成可靠服务:用Windows服务封装实现开机自启与崩溃自恢复

Release包的“双击即启”只是开发态便利,生产环境必须将其注册为Windows服务——这样它才能:

  • 开机自动运行,无需人工登录;
  • 崩溃后自动重启(Windows服务恢复策略);
  • 被SCM(服务控制管理器)统一监控,避免被误关;
  • 以LocalSystem权限运行,规避用户会话限制。

ZLMediaKit官方未提供服务安装脚本,但Windows原生支持sc命令行工具。以下方案经某高校实验室三年线上运行验证,零维护故障。

5.1 创建服务安装脚本:用sc命令注册ZLMediaKit为Windows服务

在D:\zlm\目录下新建文本文件install_service.bat,内容如下(请严格按格式复制,路径勿含空格):

@echo off set SERVICE_NAME=ZLMediaKit set EXE_PATH=D:\zlm\ZLMediaKit.exe set CONF_PATH=D:\zlm\conf\config.ini :: 删除旧服务(若存在) sc delete %SERVICE_NAME% >nul 2>&1 :: 创建新服务,关键参数说明: :: binPath= 指向exe,后接 -c 指定配置文件路径(必须!否则服务找不到conf/) :: start= auto 设为自动启动 :: obj= LocalSystem 以系统权限运行,避免用户登录态依赖 :: depend= Tcpip 依赖TCP/IP协议栈 sc create %SERVICE_NAME% binPath= "%EXE_PATH% -c %CONF_PATH%" start= auto obj= LocalSystem depend= Tcpip :: 设置服务恢复策略:第一次失败后重启,第二次失败后重启,后续失败后重启 sc failure %SERVICE_NAME% reset= 0 actions= restart/60000/restart/60000/restart/60000 :: 启动服务 sc start %SERVICE_NAME% echo 服务 %SERVICE_NAME% 已安装并启动。 pause

逻辑说明:

  • binPath=后必须跟完整路径+参数,-c %CONF_PATH%确保服务模式下能正确定位配置;
  • obj= LocalSystem是关键,若设为.\Administrator,服务将在用户登出后停止;
  • sc failure命令设置三次重启策略,间隔60秒(60000毫秒),这是防止频繁崩溃的兜底机制。

5.2 验证服务状态与日志:用PowerShell实时监控服务健康度

服务安装后,不再依赖控制台窗口。用PowerShell进行专业级验证:

# 查看服务状态(Running/Stopped) Get-Service ZLMediaKit | Select-Object Name, Status, StartType # 查看最近10条系统日志(含服务启动/崩溃事件) Get-EventLog -LogName System -Source "Service Control Manager" -Newest 10 | Where-Object {$_.Message -like "*ZLMediaKit*"} # 实时跟踪ZLMediaKit日志文件(推荐用Get-Content -Wait) Get-Content "D:\zlm\logs\ZLMediaKit.log" -Wait -Tail 10

提示:若Get-Service返回Stopped,执行Start-Service ZLMediaKit;若启动失败,用Get-EventLog查Error级别事件,通常暴露DLL缺失或端口冲突。

5.3 服务化后的配置热更新技巧:无需重启服务即可生效的3种场景

Windows服务模式下,ZLMediaKit.exe进程常驻,但配置变更仍需生效。ZLMediaKit支持部分配置热重载,无需sc stop/start:

配置文件可热更新项操作方式生效时间
conf/config.inihttp.port,rtp.address修改后保存,ZLMediaKit自动检测<1秒
conf/config.inihls.enable,hls.path同上<1秒
conf/plugin.inienable=1/0for any plugin同上<1秒

注意:maxStreamNum、logLevel等核心参数不支持热更新,修改后必须重启服务:sc stop ZLMediaKit && sc start ZLMediaKit。我一般会把maxStreamNum设为略高于峰值需求的值,避免频繁重启。

5.4 服务崩溃自愈的边界:什么情况下Windows服务恢复策略会失效?

Windows服务恢复策略强大,但有明确边界。以下情况它无法挽救,需人工介入:

场景为什么失效应对措施
conf/config.ini语法错误服务启动时解析失败,进程立即退出,SCM认为“启动失败”而非“运行中崩溃”每次修改配置后,先用ZLMediaKit.exe -c conf/config.ini -d本地测试
www/目录被删除或权限丢失服务启动成功,但HTTP请求时因路径不存在抛异常退出用icacls D:\zlm\www /grant "NT AUTHORITY\SYSTEM:(OI)(CI)F"重置权限
磁盘满导致logs/写入失败进程因IO错误退出,SCM尝试重启但持续失败(因磁盘仍满)设置日志滚动策略(logSize=100,logNum=5),并用任务计划定期清理

我给自己定的铁律是:每周五下午用PowerShell脚本巡检一次ZLMediaKit服务状态,并自动清理30天前的日志。脚本核心就三行:

if ((Get-Service ZLMediaKit).Status -ne 'Running') { Start-Service ZLMediaKit } Get-ChildItem "D:\zlm\logs\*" -Recurse | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} | Remove-Item

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询