视频预览链路三件套:ZLMediaKit · MediaMTX · FFmpeg 完全指南
视频预览链路三件套ZLMediaKit · MediaMTX · FFmpeg 完全指南摄像头视频预览实现教程从原理到落地(ZLMediaKit flv.js Spring Boot)https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/163018250它们在本项目里的角色与链路浏览器无法直接播放摄像头 RTSP 流必须“服务端转协议 前端播放器”。本项目链路海康摄像头 RTSP (或 本地模拟的假摄像头) │ RTSP 拉流 ▼ ZLMediaKit (MediaServer.exe) ← 把 RTSP 转封装成 HTTP-FLV链路核心 │ HTTP-FLV ▼ 浏览器 flv.js 播放 (Vue2 设备页 / 大屏首页详情弹窗) 本地模拟时多出的两环 ffmpeg 循环推流 ──RTSP推流──▶ MediaMTX(RTSP服务) ──▶ ZLMediaKit (假摄像头) (8554/cam1) (80)软件真实环境作用本地模拟额外作用FFmpeg一般不直接用把本地test.mp4循环推成 RTSP充当“假摄像头”MediaMTX一般不直接用极简 RTSP 服务器接收 ffmpeg 推流提供rtsp://127.0.0.1:8554/cam1ZLMediaKit把摄像头 RTSP 转 HTTP-FLV链路核心同上只是源来自 MediaMTX项目实际运行参数ZLMediaKit 监听80端口MediaMTX 监听8554流名cam1FFmpeg 推流到该源。前端最终播放地址形如http://127.0.0.1/live/dev_6.live.flv。一、ZLMediaKitMediaServer.exe1.1 软件介绍定位国产开源流媒体服务器CGitHub:ZLMediaKit/ZLMediaKit主打“高性能、低延迟、多协议互通”。核心能力协议互通RTSP / RTMP / HLS / HTTP-FLV / WebRTC / SRT 间可互相转封装或转码。拉流代理本项目关键addStreamProxy主动拉取外部 RTSP/RTMP 源转成多种格式对外提供相当于“协议翻译官”。按需拉流无人观看时依streamNoneReaderDelayMS自动断流也支持 Hook 回调如on_stream_none_reader让业务系统决定何时关流。完备 HTTP 管理 API/index/api/*建流、查询、踢人、媒体列表等。性能纯 C 单进程转封装不转码时 CPU 占用极低普通服务器可支撑数十路甚至上百路子码流开启转码才需评估 GPU/CPU。为何选它① 单 exe、零依赖、Windows 部署极简② 原生 HTTP-FLV 与 flv.js 完美契合1~3s 延迟无插件③ 标准 RTSP 接入兼容海康/大华/宇视等多品牌④ 同一套基础设施可平滑升级 WebRTC1s做实时联动。对比相较 nginx-rtmp配置繁琐、FLV 弱、SRS偏 Linux 服务化ZLMediaKit 在 Windows 单机、轻量嵌入场景更顺手。1.2 安装方式一预编译包推荐GitHub Release 下载 Windows 构建windows.zip/ZLMediaKit_win64。解压到固定目录避免中文/空格如D:\tools\ZLMediaKit\ZLMediaKit\ ├── MediaServer.exe # 核心主程序 ├── config.ini # 配置文件必须 ├── ssl.p12 / default.pem# 证书HTTPS/WebRTC 才需要 └── www\ # 内置测试页方式二源码编译需自定义功能时依赖 CMake、VS2019、OpenSSLgit clone --recursive→cmake→ 编译。一般无需。方式三注册 Windows 服务生产必做开机自启nssm install ZLMediaKit D:\tools\ZLMediaKit\MediaServer.exe nssm set ZLMediaKit AppDirectory D:\tools\ZLMediaKit nssm set ZLMediaKit Start SERVICE_AUTO_START nssm start ZLMediaKit :: 状态/停止/卸载nssm status|stop|remove ZLMediaKit confirm也可用“任务计划程序”建“计算机启动时运行”指向MediaServer.exe -c config.ini。验证前台cd /d D:\tools\ZLMediaKit MediaServer.exe浏览器访问http://127.0.0.1:80/index/api/getServerConfig?secretxxx返回 JSON 即成功。系统要求Windows 7/Server 20082 核 4G 起步纯转封装 1 核 2G 也可跑几路。防火墙放行netsh advfirewall firewall add rule nameZLM-HTTP dirin actionallow protocolTCP localport80 netsh advfirewall firewall add rule nameZLM-RTSP dirin actionallow protocolTCP localport554 netsh advfirewall firewall add rule nameZLM-RTMP dirin actionallow protocolTCP localport19351.3 配置config.ini[api] secretxxx # 调所有 /index/api/* 必须带此密钥务必强随机且与 application.yml 的 zlm.secret 完全一致。 [http] port80 # HTTP-FLV 播放 API 端口。80 被 IIS/系统占用就改 8080并同步改 zlm.http-port 与前端地址。 [rtsp] port554 # ZLM 自身 RTSP 服务端口本项目是主动拉摄像头一般不冲突 [rtmp] port1935 [rtc] externIP192.168.1.100 port8000 # WebRTC 才需要HTTP-FLV 方案暂不用 [hook] enable1 on_stream_none_readerhttp://127.0.0.1:8080/system/device/stream/none-reader # 高级控制无人观看自动关流、播放鉴权。也可仅靠 streamNoneReaderDelayMS。 [general] streamNoneReaderDelayMS20000 # 无人观看 20s 后自动断流按需拉流核心。与 Spring Bootapplication.yml映射两端必须对齐config.iniapplication.yml (zlm.*)说明[api].secretzlm.secret必须完全一致[http].portzlm.http-port必须完全一致—zlm.host后端调 ZLM API 的地址内网 IP—zlm.play-host返回给浏览器的播放地址跨网/域名时填公网可达地址—zlm.app流应用名本项目live生成/live/xxx.flvhost与play-host分离设计后端与浏览器不同网络时后端用host访问 API把play-host公网域名返回前端播放二者可不同。1.4 指令 / API 详解① 添加拉流代理GET /index/api/addStreamProxy ?secretsecret vhost__defaultVhost__ applive streamdev_1 # 建议用 deviceId 作流名 urlrtsp://admin:pwd192.168.1.64:554/Streaming/Channels/102 rtp_type0 # 0TCP 拉流(抗丢包,推荐) 1UDP 返回: {code:0,data:{key:__defaultVhost__/live/dev_1}}② 生成的播放地址HTTP-FLV: http://IP:80/live/dev_1.live.flv ← 本项目前端用这个 HLS: http://IP:80/live/dev_1/hls.m3u8 (需 enable_hls1) WebRTC: http://IP:80/index/api/webrtc?applivestreamdev_1typeplay③ 关闭代理释放资源GET /index/api/delStreamProxy?secretsecretstreamKeylive/dev_1注意参数名代码里用streamKeyZLM 文档常写key。本项目验证脚本直接调 ZLM 用keylive/dev_6后端调 ZLM 用streamKey需统一。1.5 常见问题现象原因 / 解决80 端口起不来被 IIS / SVCHOST 占用 → 改config.ini [http].port8080同步改zlm.http-port前端黑屏一直加载①F12 看 flv 请求是否 200 ②ZLM 是否真拉到 RTSP看日志/getMediaList③RTSP 账号密码/通道码流是否正确addStreamProxy 返回非 0流已存在可忽略幂等或 RTSP 不可达用 VLC 打开该 RTSP 验证摄像头侧延迟 3s关 flv.jsstashBuffer、改子码流、rtp_type0仍不够升级 WebRTC局域网能看外网看不到摄像头/ZLM 在内网需 Nginx 反代或端口映射1.6 使用场景示例生产设备页点“视频预览” → 后端按deviceId查bus_device.video_url海康 RTSP→ 调addStreamProxy建流 → 返回http://IP:80/live/dev_x.live.flv→ flv.js 播放关闭弹窗调delStreamProxy释放。本机模拟见第四节一键脚本。二、MediaMTXmediamtx.exe原 rtsp-simple-server2.1 软件介绍定位极简、单文件、零依赖流媒体服务器GoGitHub:bluenviron/mediamtx原名 rtsp-simple-server。核心能力支持 RTSP / RTMP / HLS / WebRTC / SRT / UDP-MPEGTS开箱即用无配置即监听默认端口多路流按路径区分/cam1、/cam2自动创建内存占用极低50MB。在本项目角色仅本地模拟时用当“假摄像头的 RTSP 服务端”——接收 FFmpeg 推来的循环视频对外提供rtsp://127.0.0.1:8554/cam1供 ZLMediaKit 拉取。真实环境有真摄像头时不参与。为何选它比 ZLMediaKit 更轻、配置更少专门解决“需要一个 RTSP 源”与 FFmpeg 组合是业界标准模拟方案。对比 Live555/Wowza单文件、跨平台、无授权费。2.2 安装GitHub Release 下载mediamtx_vX.X.X_windows_amd64.zip解压得单文件mediamtx.exe放到D:\tools\mediamtx\。可选同目录放mediamtx.yml自定义不放在则全默认。系统要求Windows 任意较新版本几乎不挑机器。启动验证D:\tools\mediamtx\mediamtx.exe→ 日志出现RTSP server listening on :8554即成功此时还没推流cam1会在 FFmpeg 推流时自动出现。其他平台Linux/macOS 下./mediamtxDockerdocker run --rm -p 8554:8554 bluenviron/mediamtx。2.3 配置mediamtx.yml默认即可用rtspAddress::8554# RTSP 监听地址:端口readTimeout:10s# 推流端断流后多久认为流结束# authMethods: [basic] # 可选鉴权# readUser: user# readPass: pass# rtmpAddress: :1935 # 也可开启 RTMP/HLS/WebRTC本项目约定流路径固定cam1rtsp://127.0.0.1:8554/cam1与 FFmpeg 推流 URL、设备videoUrl三处必须一致8554 被占用改:8555并同步另两处它只提供 RTSP 源HTTP-FLV 由 ZLMediaKit 生成。2.4 指令 / 用法详解MediaMTX 主要作接收端配合 FFmpeg 推流推流地址格式rtsp://host:port/stream-path本项目rtsp://127.0.0.1:8554/cam1。多路换路径即可/cam2。也支持 RTMP 推流与 HLS 输出按需使用。2.5 常见问题现象解决ZLM 拉不到 cam1先确认 mediamtx 在跑、8554 监听再确认 ffmpeg 推流已启动cam1 按需出现没人推就没有8554 被占用改mediamtx.yml的rtspAddress同步 ffmpeg 推流 URL推流后源无画面用ffprobe验证检查 ffmpeg 进程是否存活2.6 使用场景示例本地无摄像头调试MediaMTX 当 RTSP 源服务器 FFmpeg 把测试片循环推成cam1让整条预览链路不含真实硬件完整可验证。三、FFmpegffmpeg.exe3.1 软件介绍定位业界事实标准开源音视频处理命令行工具集CGitHub/FFmpeg含ffmpeg转码/推流、ffprobe探测、ffplay播放。核心能力格式互转、转码、剪辑、滤镜、截图、推/拉流支持file/rtsp/rtmp/http/udp/srt等海量协议。在本项目角色仅本地模拟时用把test.mp4循环推成 RTSP 流模拟“摄像头持续出画面”。真实环境摄像头自带 RTSP 输出不经 FFmpeg。为何选它免费、跨平台与 MediaMTX 组合是标准模拟方案-stream_loop -1无限循环完美模拟 7×24 监控。对比 OBS偏 GUI 直播、GStreamer偏管线编程FFmpeg 命令行最适合脚本化无人值守推流。3.2 安装官网 https://ffmpeg.org/download.html → Windows 选gyan.dev或BtbN构建的ffmpeg-*-full_build包。解压得bin\ffmpeg.exe推流、ffprobe.exe探测、ffplay.exe播放。本项目实际C:\tools\ffmpeg\bin\文档示例D:\tools\ffmpeg\bin\。加 PATH推荐把bin加入系统Path之后任意命令行直接ffmpeg/ffprobe或脚本写绝对路径。验证ffmpeg -version输出版本即成功。系统要求Windows 任意版本-c copy不转码时几乎零 CPU。准备测试片test.mp4几秒短片便于观察循环H264AAC 最稳。3.3 配置FFmpeg无配置文件行为全由命令行参数决定。本项目推流命令逐参数说明ffmpeg -re -stream_loop -1 -i test.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/cam1参数含义-re按文件原始速率读取实时推流不加会瞬间推完导致流中断-stream_loop -1输入循环次数-1 无限循环模拟持续监控-i test.mp4输入文件-c copy不转码直接拷贝流最省 CPU要求源封装兼容 RTSP-f rtsp强制输出封装为 RTSPrtsp://127.0.0.1:8554/cam1推流目标MediaMTX 地址 流名变体-c copy因封装不兼容失败时改转码-c:v libx264 -c:a aac。常用附加-an去音频、-vf scale1280:720缩放、-b:v 1M限码率、-rtsp_transport tcp探测时用。排障辅助ffprobe -rtsp_transport tcp -hide_banner rtsp://127.0.0.1:8554/cam1 :: 期望看到 Stream #0:0: Video: h264 ... 和 Stream #0:1: Audio: aac ...3.4 常见问题现象解决画面卡住 / 不循环确认带-stream_loop -1确认test.mp4可解码“Protocol not found”构建不含 RTSP muxer换 gyan.dev 完整构建CPU 占用高用-c copy避免转码转码时降分辨率/帧率3.5 使用场景示例假摄像头ffmpeg -re -stream_loop -1 -i test.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/cam1→ ZLMediaKit 拉到稳定源前端预览出现循环画面。四、三者协作的端到端示例本地模拟:: 1) 启动 MediaMTXRTSP 源服务器 start mediamtx.exe :: 2) 启动 ZLMediaKitHTTP-FLV端口80 start MediaServer.exe -c config.ini :: 3) FFmpeg 把测试片循环推成 cam1 源 start ffmpeg -re -stream_loop -1 -i test.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/cam1 :: 4) 设备 videoUrl 设为rtsp://127.0.0.1:8554/cam1 :: 5) 前端点视频预览 → 看到循环画面 :: 验证 ZLM 接口不依赖前端 curl http://127.0.0.1:80/index/api/addStreamProxy?secret035c73f7-bb6b-4889-a715-d9eb2d1925ccvhost__defaultVhost__applivestreamdev_1urlrtsp://127.0.0.1:8554/cam1rtp_type0 :: 浏览器打开 http://127.0.0.1/live/dev_1.live.flv 应能看到流 curl http://127.0.0.1:80/index/api/delStreamProxy?secret035c73f7-bb6b-4889-a715-d9eb2d1925ccstreamKeylive/dev_1五、排障总览三件套联动先确认源最底层ffprobe rtsp://127.0.0.1:8554/cam1能否看到 h264 轨 → 验证 FFmpeg 推流 MediaMTX。再确认转换层ZLM 进程在不在、80 端口是否监听、getServerConfig是否返回 JSON → 验证 ZLMediaKit。最后确认播放层浏览器 F12 看*.flv请求是否 200、flv.js 是否报错 → 验证前端。端口冲突优先查 80IIS和8554多个 MediaMTX 实例。secret 必须全链路一致config.ini [api].secretapplication.yml zlm.secret 后端调 API 携带值。六、三件套“介绍 / 安装 / 配置”对照表维度ZLMediaKitMediaMTXFFmpeg一句话RTSP→HTTP-FLV 转换核心轻量 RTSP 源服务器模拟用视频转码/推流工具模拟用安装复杂度中解压配 ini服务化低单 exe 即跑低解压加 PATH配置文件config.ini必须仔细配mediamtx.yml默认即可无纯命令行参数关键配置点secret、http.port、streamNoneReaderDelayMSrtspAddress、流路径 cam1-re -stream_loop -1 -c copy -f rtsp真实环境是否需要必须不需要不需要本地模拟是否需要必须必须必须