ZLMediaKit Windows免编译版实战:从解压到流媒体服务部署
2026/9/7 9:02:53 网站建设 项目流程

简介:ZLMediaKit 是一款基于 C++11 的运营级流媒体服务框架,支持 RTMP、HLS、HTTP-FLV 等主流协议,并提供推流、拉流、录制、截图等能力。本资源为 Windows 平台免编译 Release 版本,适合需要在 Windows 10 下快速搭建流媒体服务或进行功能验证的开发者,无需安装编译环境即可直接部署。压缩包共 86 个文件,约 133.23MB,主要包括 MediaServer.exe、mk_api.dll 等可执行程序与动态库,以及 config.ini、default.pem 等配置文件和 js、html、css 前端页面,另附 pdb、ilk 等调试文件,便于本地调试与二次开发。Debug 目录组织清晰,内置日志与示例工具,可辅助理解流媒体服务工作原理。已有 525 人学习下载。通过该包可快速启动服务、完成推拉流测试,并借助配套接口与前端代码深入实践 ZLMediaKit 的部署与扩展。 搞流媒体服务的朋友应该都听过ZLMediaKit这个项目,功能覆盖RTSP、RTMP、HLS、HTTP-FLV、WebRTC这些主流协议,性能在同类型开源项目里属于第一梯队。但它本身是C++项目,想在Windows上从源码编译出一套可执行文件,得先过CMake、OpenSSL、SRTP这些依赖的关,很多人就是卡在这一步被劝退的。所以官方在Release里直接维护了一版Windows免编译的成品包,解压后双击MediaServer.exe就能把服务跑起来。这篇文章把我实际使用这套免编译版本的经验完整梳理一遍,适合想快速验证流媒体功能、做本地联调,或者在Windows机器上部署直播转推服务的同学参考。

1. ZLMediaKit是什么,免编译版解决了什么问题

1.1 项目定位与核心能力

先说清楚它是个什么东西。ZLMediaKit是一个基于C++11开发的高性能流媒体服务框架,采用MIT协议开源,商用几乎没有限制。它做的事情用一句话概括:把各种来源的音视频流收进来,按你需要的协议格式分发出去。比如你把一路RTSP摄像头流推给它,它就能同时输出RTMP、HTTP-FLV、HLS、WebRTC给不同的播放端,也可以反向把RTMP流转成RTSP再输出。这套能力在安防监控、直播、在线教育、智能硬件这些场景里非常常见。

它内部支持的功能点包括:RTSP/RTMP推拉流、HLS切片与播放、HTTP-FLV流媒体、WebRTC推拉流、GB28181国标接入(安防领域的核心协议)、集群化部署接口、录像与回放等等。相比mediamtx(原rtsp-simple-server)这类轻量替代品,ZLMediaKit最大的优势在于协议转换完整、API接口丰富、社区活跃,很多商业项目直接拿它做底层服务。我自己在选择流媒体中间件时对比过几轮,最终稳定用它,核心原因就是它的API设计比较规整,二次开发成本低。

1.2 为什么直接选Windows免编译Release

我第一次接触这项目时也是从源码编译入手的,折腾了一整个下午。这项目依赖不是一般的多,编译器版本、CMake版本、各依赖库版本互相影响,稍微对不上就会在链接阶段报一堆莫名其妙的错误。对大多数人来说,核心诉求是先跑起来看看效果,而不是去研究C++工程构建,所以官方在GitHub的Releases页面直接发布了Windows平台的预编译版本,这一步就直接省掉了。

免编译版还有一个容易被忽视的好处:环境一致性。你下载到的exe是官方构建环境产出的,只要Windows版本不太老、VC运行库不缺,就能直接跑,不会出现"我这能编过你那编不过"的尴尬。对团队协作也友好:公司内部分发这套Release包,同事双击就能起服务,不需要统一安装VS、CMake这些开发环境,入职培训的成本一下子降下来了。

2. 下载与启动:从解压到服务跑起来

2.1 怎么找到并识别正确的Release包

去GitHub的ZLMediaKit/ZLMediaKit仓库,切到Releases页面,找名称里带Windows字样的zip包。下载前注意两点:一看构建日期是否较新,二看包内是否包含config.ini、www这些运行必需的文件。有些第三方转存的版本精简过头,把配置文件也删了,下载下来反而更麻烦。

拿到压缩包后,解压到纯英文路径,比如C:\zlmediakit,尽量避免中文目录。原因很实际:后续配置、拉流URL、录像文件路径都涉及编码处理,中文目录在某些组合下会踩编码坑,没必要赌这个。解压后目录里通常包含这些内容:

  • MediaServer.exe:主程序,整个服务的入口;
  • config.ini:核心配置文件,所有协议端口、鉴权、回调都在这里;
  • www目录:内置web播放页面和静态资源;
  • 若干dll和.pdb:运行库和调试符号文件,pdb不用管,dll别乱删。

2.2 双击启动与启动验证

最简单的启动方式就是双击MediaServer.exe。这时候会弹出一个控制台窗口,滚动输出日志,内容包括监听端口、加载配置、hook回调信息等。日志里有几行值得关注:

  • 协议支持情况,RTSP、RTMP、HTTP是否都成功初始化;
  • 端口监听是否成功,如果看到bind failed之类的字样,说明端口被占用,具体排查方法在第4节;
  • 首次启动时日志会打印API secret等关键信息,这个后面排查鉴权要反复用到。

服务起来之后,打开浏览器访问http://127.0.0.1会进入内置的web播放测试页面,这是最直观的验证方式:页面能打开、能显示服务状态,说明基本链路通了。默认80端口如果被业务占用,改config.ini里[http]部分的port,重启后再用新端口访问。

注意:控制台窗口别顺手关掉,关掉等于杀掉服务。需要长期运行时,建议用nssm把这套程序注册成Windows服务,具体做法在第5节。

3. 核心功能实操:推流、拉流与协议转换

3.1 config.ini关键参数解读

免编译版的默认配置已经能直接工作,但几个关键参数必须知道在哪改。配置文件是INI格式,按中括号分区:

  • [rtsp]和[rtmp]:两个协议的监听端口,默认是554和1935。端口被占用或想换端口时改这里;
  • [http]:web页面、HTTP-FLV、HLS对外服务的端口,默认80。多服务共用一台机器时,这个端口最容易被占;
  • [api]:重点是secret字段,这是所有HTTP管理接口的调用密钥。出厂默认值在日志和配置里都能看到,生产环境必须改掉,否则等于管理接口裸奔;
  • [hook]:服务事件回调,比如推流开始、推流结束可以回调到你的业务服务器,用来做鉴权、统计、告警。

改完配置后需要重启MediaServer.exe才生效。改之前建议先备份一份原始config.ini,新手改错时能快速回滚。还有个小技巧:用文本编辑器改完保存时,注意别把文件编码改成带BOM的UTF-8,某些版本对配置文件的编码比较敏感,BOM会引发解析异常。

3.2 用FFmpeg推流验证全链路

先下载一个Windows版FFmpeg,准备好一个本地视频文件,执行下面的命令就能推到ZLMediaKit:

ffmpeg -re -stream_loop -1 -i test.mp4 -c copy -f flv rtmp://127.0.0.1/live/test

这条命令的意思是循环推送本地test.mp4,保持原始编码不转码(-c copy),通过RTMP协议推到服务器的live应用中,流名是test。推流成功后,以下几个地址会同时可用:

  • RTMP播放:rtmp://127.0.0.1/live/test
  • RTSP播放:rtsp://127.0.0.1/live/test
  • HTTP-FLV播放:http://127.0.0.1/live/test.flv
  • HLS播放:http://127.0.0.1/live/test/hls.m3u8

用VLC或者浏览器里的flv.js、hls.js都能验证播放。我最常用的快速验证方法是用VLC打开URL,能出画面就说明链路通了。这里要理解一点:推流和拉流用的是同一个app和stream名称,ZLMediaKit不区分推流协议和拉流协议,收到流之后会自动维护多协议的输出能力,这就是它"协议转换"的核心逻辑。

3.3 拉取远程流:addStreamProxy的用法

除了主动推流,ZLMediaKit最常用的功能是拉流代理:让它主动去拉一个远端流地址,再转换成其他协议分发给本地播放端。这个操作通过HTTP接口完成,前提是知道API secret。

curl "http://127.0.0.1/index/api/addStreamProxy?secret=你的secret&vhost=__defaultVhost__&app=live&stream=proxy01&url=rtsp://192.168.1.10:554/stream1"

url参数填要拉取的远端流地址,app和stream用来定义它在服务器上的唯一标识。调用成功后,就能用http://127.0.0.1/live/proxy01.flv这样的地址播放了。这个功能在对接第三方平台、把不支持WebRTC的老设备转成WebRTC输出、或者把内网流暴露到外网时特别实用,我做过一个项目就是靠这个接口把十几路海康摄像头的RTSP流统一转成了HTTP-FLV给前端页面播放。

4. 常见问题与排查技巧实录

4.1 启动失败:端口被占用

启动日志里如果出现bind失败,或者服务能开但拉流地址不通,第一反应查端口。常见的是80端口被IIS或其他web服务占用,1935端口被别的直播软件占用。用netstat确认:

netstat -ano | findstr ":80 "

拿到占用进程的PID后,去任务管理器确认是什么程序,再决定是停掉它还是改ZLMediaKit的端口。注意修改端口之后,所有拉流地址里的端口也要跟着改,比如RTSP默认554被占用改成8554,播放地址就要写成rtsp://127.0.0.1:8554/live/test。这个细节看着不起眼,实际排查时最容易忽略。

4.2 老系统启动报"无法定位程序输入点"

这是Windows免编译版一个比较典型的坑。部分低版本Windows(比如没打补丁的Win7)在双击exe时会弹窗提示"无法定位程序输入点SetThreadDescription于动态链接库KERNEL32.dll"。原因是新版编译工具链生成的程序用到了较新的系统API,老系统内核里没有这个函数。遇到这个提示不用慌,这不是文件损坏,是系统和程序之间的兼容性问题。解决办法按优先级排:

  • 日常开发调试尽量用Win10及以上系统;
  • Win7机器尝试打全系统补丁,部分场景能解决;
  • 实在不行就翻找历史版本的Release包,老包通常使用更保守的编译参数;
  • 或者直接放弃Windows,部署到Linux环境,ZLMediaKit在Linux上同样是主流用法。

4.3 拉流403或鉴权失败

访问接口返回401或403,绝大多数是secret不对。默认config.ini里的secret一定要和请求里携带的参数保持一致。另一个常见场景是启用了推流鉴权回调(on_publish等hook),如果业务服务器没正确放行,推流就会失败,表现是推流工具报连接被断开,但服务日志里没有任何明显错误。排查思路按顺序来:先确认secret,再确认hooks配置,最后看服务日志里的鉴权拒绝记录。

我踩过的一个坑:改了config.ini但没重启服务,反复奇怪为什么配置不生效。这项目的配置是启动时一次性加载的,运行中修改不会热更新,改完一定要重启进程。

5. 基于免编译版的扩展玩法

5.1 注册为Windows服务常驻后台

双击exe适合临时调试,生产环境还是需要服务化。推荐用nssm(Non-Sucking Service Manager),命令行注册非常简单:

nssm install ZLMediaKit C:\zlmediakit\MediaServer.exe nssm set ZLMediaKit AppDirectory C:\zlmediakit nssm start ZLMediaKit

注册之后服务会随系统开机自启,不用每次手动开窗口。注意AppDirectory一定要设置,否则服务可能因为找不到配置文件或www目录而启动失败。对于长期跑流媒体服务的机器,这一步非常关键,另外建议把日志输出重定向到文件,方便出问题时回溯。

5.2 WebRTC与GB28181国标场景

免编译版也内置了WebRTC支持,浏览器可以通过HTTPS页面直接播放WebRTC流,适合低延迟互动场景。另外安防项目中常见的GB28181国标接入也是这个项目的重要卖点,很多做监控平台的团队直接拿这套Windows版对接海康、大华的摄像头国标服务。需要提醒的是,WebRTC和GB28181相关配置在config.ini里有专门区块,涉及端口范围、公网IP等参数,生产环境要逐一确认。这几个功能不是默认配置开箱即用到最优的,必须结合实际的网络环境调,比如WebRTC的ICE候选地址如果配错,外网播放端就会一直卡在连接阶段。

5.3 二次开发的准备

如果你是做业务开发的,先别急着上源码编译。很多需求其实通过HTTP API就能满足:查询流列表、踢流、录像管理、流代理管理,接口文档在项目WIKI里都有。先用免编译版把API调试通了,再决定是否切换到源码自行定制。这个顺序能帮你省很多时间,也避免一开始就陷进构建泥潭。

关于后续扩展,我实际用的体会是:这套免编译包最大的价值不是省一次编译的时间,而是降低了一个团队的试错成本。先在Windows上把协议流程跑通、把API联调好,再决定是否上Linux集群,整个项目的推进节奏会顺畅很多。

最后再分享一个小经验:不管用哪个版本,拿到包之后先做一次完整的推流、拉流、转协议、录像全链路测试,把默认secret改掉、端口规划好,再继续深入使用。基础链路验证过一遍,后面折腾什么功能心里都有底。

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

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

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

立即咨询