ZLMediaKit实用指南:源码编译到首播流,10分钟内打通推流与排错
【免费下载链接】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 C++11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit
想让摄像头的RTSP画面推到网页上播,或者一路RTMP源同时转发成HLS、HTTP-FLV给不同客户端?ZLMediaKit是一个C++11流媒体服务器框架,RTSP、RTMP、HTTP-FLV、HLS、WebRTC、SRT、GB28181多协议推拉流都内置了,带协议互转、录制、HTTP API与WebHook钩子,可以直接部署成直播服务。
📦 项目速览
- 推拉流、转协议、录制、截图一套服务端能力,不用自己写协议代码
- 一路流进、多协议出,各协议之间按需互转,播放端用什么协议就出什么协议
- 内置RESTful API和WebHook钩子,任何语言的业务系统都能调
- Linux、Windows、macOS、Android可跑,x86和ARM都行
- 附带C API,可以当成SDK链进你自己的产品
从源码到第一条流
新机器上只需要编译器工具链和CMake,四步拿到能收流的进程:
sudo apt install build-essential cmake git # 装构建工具 git clone https://gitcode.com/GitHub_Trending/zl/ZLMediaKit # 拉源码 cd ZLMediaKit && mkdir build && cd build cmake .. # 默认Debug,把配置样例拷到输出目录 make -j$(nproc)产物在release/linux/Debug/MediaServer,进程默认加载同目录的config.ini(cmake时会把 conf/config.ini 拷过去,后续改配置改这份就行):
./release/linux/Debug/MediaServer启动后默认监听HTTP 80、RTMP 1935,跑一句curl 127.0.0.1/index/api/getServerConfig返回JSON即表示服务可用。
核心能力拆解
RTMP / HTTP-FLV:最常用的推拉流组合,src/Rtmp/ 里有完整协议栈、推流客户端和FLV分流器。推流到rtmp://127.0.0.1:1935/live/test后,浏览器直接访问http://127.0.0.1/live/test.flv,无需二次转推。
RTSP:src/Rtsp/ 实现服务器、播放器、推流客户端三种角色,RTP走TCP、UDP、组播都支持,默认端口554。服务端已有的流可以用rtsp://127.0.0.1:554/live/test直接播。
WebRTC:webrtc/ 是完整ICE/DTLS/SRTP协商栈,主打浏览器低延迟播放。8000号UDP和TCP端口必须放通,NAT后面做端口映射时,外网映射端口必须和监听端口一致。
RTP代理与GB28181:src/Rtp/ 接收国标设备直发的PS/TS流,解封装成标准流后再转成任意协议,默认监听10000。
场景实操:拉取内网摄像头流,录制并网页播放
以一台RTSP地址为rtsp://192.168.1.64:554/stream1的摄像头为例。先用API让服务器代拉并挂起这路流:
curl '127.0.0.1/index/api/addStreamProxy?vhost=__defaultVhost__&app=camera&stream=cam01&url=rtsp://192.168.1.64:554/stream1'服务端自动转出多协议:网页播http://<服务器IP>/live/camera/cam01.flv,移动端播http://<服务器IP>/live/camera/cam01/hls.m3u8。需要落盘存留时调录制接口:
curl '127.0.0.1/index/api/startRecord?schema=rtsp&vhost=__defaultVhost__&app=camera&stream=cam01&mp4_save_path=./record'🔧 调参与运维
以下开关都在程序目录的config.ini里改,改完重启生效:
protocol.enable_hls/protocol.enable_mp4:转协议开关,流上线后自动产出HLS切片或MP4protocol.paced_sender_ms:推流突发不均时开启平滑发送,代价是CPU略涨rtp_proxy.port_range:RTP与RTSP的UDP随机端口范围,防火墙要整段放行
监控走/index/api/下的接口,路径直接拼在HTTP端口上:
getStatistic:进程CPU、内存、带宽getMediaList:当前所有流与在线人数getServerConfig/setServerConfig:在线读、改配置close_stream:强制关闭指定流
🧯 高频排错
现象:WebRTC页面始终连不上,无音无画→ 可能原因:8000号UDP被NAT或防火墙拦截,或外网映射端口与服务器监听端口不一致。 → 定位:服务器上执行ss -ulnp | grep 8000确认监听,再看映射表是否同端口。
现象:推流成功,浏览器flv只有声音没有画面→ 可能原因:源流是H265编码,浏览器不支持硬解,而AAC音频正常。 → 定位:调getMediaInfo查看流的编码,确认是H265就换H264转推,或改用WebRTC播放。
现象:流已上线,但hls.m3u8返回404→ 可能原因:enable_hls为0,切片从未生成。 → 定位:grep enable_hls config.ini,改为1后重启再请求。
进阶入口
推播放走通后,下一步是二次开发:把 api/include/ 下的C API链进自有程序当SDK用;录制模块位于src/Record/,MP4、HLS、TS三种封装的读写实现都可以直接参考;流的上下线要通知业务系统时,看server/WebHook.cpp的钩子分发逻辑即可。
【免费下载链接】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 C++11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考