ZLMediaKit 与 Spring Boot 集成流媒体:30 分钟从部署跑到第一路直播

ZLMediaKit 与 Spring Boot 集成流媒体:30 分钟从部署跑到第一路直播 ZLMediaKit 与 Spring Boot 集成流媒体30 分钟从部署跑到第一路直播【免费下载链接】ZLMediaKitWebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT/STUN/TURN server and client framework based on C11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKitZLMediaKit 是一个 C 流媒体服务器支持 RTMP、RTSP、HLS、HTTP-FLV、WebRTC、GB28181、SRT 等协议。把它和 Spring Boot 集成后流媒体的苦活累活交给 ZLMediaKit你的 Java 业务系统只管账号、鉴权、数据库和 REST 接口。这篇指南写给会 Java、对流媒体陌生的开发者走完一遍你的服务里就有一路可以播放的直播流。分工ZLMediaKit 管流Spring Boot 管业务ZLMediaKit 负责把流收进来、转成各种协议、分发给多端播放你不需要写一行 RTP 或 RTSP 协议代码。Spring Boot 负责业务谁有权限推流、流属于哪个房间、播放记录存哪张表。两者之间只有两条通道HTTP API你主动调 MediaServer 的 REST 接口完成拉流代理、开 RTP 端口、查流列表这类控制动作。WebHookMediaServer 在推流、播放、流上下线等时刻回调你的业务接口你的返回 JSON 决定放行还是拒绝。一推一拉控制流和事件流就都闭环了。从零到第一路流 部署 MediaServer 并确认 HTTP API 可用仓库源码入口是 server/编译后得到 MediaServer 可执行文件mkdir build cd build cmake .. make -j4 ./release/linux/Debug/MediaServer # 默认加载同目录 config.ini部署注意一点MediaServer 读的是可执行文件同目录下的 config.ini不是仓库里的 conf/config.ini后者只是带注释的范例。改最小配置一个 secret一个回调地址只改三处其余保持默认[api] secret035c73f7-bb6b-4889-a715-d9eb2d1925cc # 改成你自己的Spring Boot 侧保持一致 [hook] enable1 on_publishhttp://127.0.0.1:8080/api/hook/on_publish [ffmpeg] bin/usr/bin/ffmpeg # 按你机器的实际路径改改完重启 MediaServer。127.0.0.1 访问 API 时 secret 可免跨机部署则必须传对。用 addStreamProxy 拉一路流拿播放地址Spring Boot 端用 RestTemplate 调拉流代理接口让 MediaServer 把一路 RTMP 源拉进来再分发// 调 ZLMediaKit 的拉流代理接口成功后 MediaServer 自动多协议分发 MultiValueMapString, String p new LinkedMultiValueMap(); p.add(secret, secret); // 与 config.ini 的 [api] secret 一致 p.add(vhost, __defaultVhost__); p.add(app, live); p.add(stream, s1); p.add(url, rtmp://源地址/live/s1); // 要拉取的源流 String body restTemplate.postForObject(apiBase /addStreamProxy, p, String.class);code0即成功播放地址可直接拼出http://ip:80/index/live/s1.flvHTTP-FLV或http://ip:554/live/s1RTSP。完整接口清单可看源码 server/WebApi.cpp或调/index/api/getApiList自己列一遍。让 on_publish 拦推流鉴权设备或推流端直连推流时靠 hook 做拦截。你的 hook 接口必须快速返回 JSONcode0放行PostMapping(/api/hook/on_publish) public MapString, Object onPublish(RequestParam MapString, String q) { // 推流鉴权查库校验该 stream 是否属于合法用户 boolean ok streamService.checkOwner(q.get(app), q.get(stream)); return ok ? Map.of(code, 0) : Map.of(code, -1, msg, 无权推流); }按场景选能力直播平台鉴权 生命周期推流/播放鉴权用on_publish和on_playhook返回code控制放行。流上下线监听on_stream_changed在这里写业务库别自己去轮询。源流拉不动时用addStreamProxy的retry_count参数配置自动重拉。安防 GB28181收流 抓拍openRtpServer打开 RTP 收流端口设备按国标推流进来。getSnap生成截图on_rtp_server_timeout处理设备静默离线。播放地址统一走/index/api/getStreamUrl前端只认一套 HTTP 地址。WebRTC 互动信令 房间/index/api/webrtc做 SDP 协商Spring Boot 负责把 offer/answer 在客户端与 MediaServer 间转发。addWebrtcRoomKeeper建房、listWebrtcRooms查房。on_flow_report上报流量做计费或带宽监控。工程化建议HTTP 客户端用连接池 显式超时HttpComponentsClientHttpRequestFactory设 connect 3s、read 10s避免慢请求拖垮业务线程。hook 处理器全部异步hook 回调有超时hook.timeoutSec默认 10 秒conf/config.ini 可调超时按拒绝处理。把查库逻辑丢进线程池别让同步 IO 拖慢响应。流状态以 on_stream_changed 为准业务侧只记app/stream/在线映射播放地址用getStreamUrl现算别自己拼。高频查询走缓存getMediaList这类接口别每个请求都打本地 Caffeine 缓存 3~5 秒足够。容易踩的坑secret 对不上所有 API 返回无权限现象是调用 API 报forbidden原因是业务配置和 MediaServer 的[api] secret不一致。解法两边对齐并用/index/api/version这个轻量接口先自测连通性。hook 返回体不规范推流被拒现象是推流失败但日志没报错原因是 hook 响应必须是含code: 0的 JSON且stream_id等附加字段要传字符串。解法在 hook 接口上加日志先打印实际收到的参数和返回体。流状态两边不同步现象是前端显示在线、MediaServer 里流已消失原因是你只在 API 调用时更新状态流断开时没有感知。解法以on_stream_changed回调为唯一状态源业务库只在这里写。拉流代理断流后不再恢复现象是addStreamProxy源端抖动一次后彻底失联原因是没配重试。解法调用时带retry_count并用getProxyInfo定期核对代理状态异常则重新下发。收尾这套组合的边界很清楚ZLMediaKit 把协议、转发、分发这些最难的部分封装成几十个 HTTP API 和一组 hookSpring Boot 把鉴权、状态、业务逻辑收敛在自己的世界里。两条通道各自独立任何一方重启都不会影响另一方的核心职责这也是它适合长期承载生产流量的原因。【免费下载链接】ZLMediaKitWebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT/STUN/TURN server and client framework based on C11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考