![ZLMediaKit WebRTC 使用指南:SFU(WHIP/WHEP) 与 P2P 双信令架构、HTTP API 与 [rtc] 配置全解](http://pic.xiahunao.cn/yaotu/ZLMediaKit WebRTC 使用指南:SFU(WHIP/WHEP) 与 P2P 双信令架构、HTTP API 与 [rtc] 配置全解)
音视频直播后端【免费下载链接】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点击查看免费下载ZLMediaKit 内置完整的 WebRTC 服务端框架既支持基于 HTTP 标准信令的 WHIP/WHEPSFU 中继模式也支持基于 WebSocket 自定义信令的 P2P 房间直连模式。本文以 webrtc/USAGE.md 为骨架结合 server/WebApi.cpp、server/main.cpp、webrtc/WebRtcTransport.cpp、conf/config.ini 等源码完整讲解两种模式的架构、信令 URL 格式、房间管理 API、流代理 API 以及[rtc]配置段读完即可独立完成 WebRTC 拉流代理、房间管理和相关服务端调优。一、WebRTC 双模式架构总览ZLMediaKit 的 WebRTC 模块同时支持两种截然不同的信令与媒体转发模型二者由 URL 参数signaling_protocols区分0或1SFU 模式WHIP/WHEP媒体流全部经服务器中继天然支持多路复用与转码适合广播、多人会议等场景P2P 模式WebSocket 信令信令仍经过服务器WebSocket STUN TURN 辅助但媒体面由两端直接建立连接降低服务器带宽压力适合低延迟通话与私人通信。在服务端实现上两类连接由不同的 Session 承载信令由WebRtcWebcosktSignalingSessionWebSocket 信令服务器处理媒体面统一由WebRtcSessionUDP/TCP承载STUN/TURN 由IceSession提供。对应启动逻辑见 server/main.cpp// webrtc udp服务器 if (rtcPort) { rtcSrv_udp-startWebRtcSession(rtcPort, listen_ip); } if (rtcTcpPort) { rtcSrv_tcp-startWebRtcSession(rtcTcpPort, listen_ip); } // webrtc 信令服务器 if (signalingPort) { signaleSrv-startWebRtcWebcosktSignalingSession(signalingPort); } if (signalSslPort) { signalsSrv-startWebRtcWebcosktSignalSslSession(signalSslPort); } // STUN/TURN服务 if (icePort) { iceSrv-startIceSession(icePort); } if (iceTcpPort) { iceTcpSrv-startIceSession(iceTcpPort); }注意以上所有服务均遵循“端口为 0 则不开机”的约定详见 server/main.cpp 对signalingPort、icePort等配置的读取因此默认conf/config.ini中这些端口为0时 WebRTC 相关服务不会启动。1. SFU 模式WHIP/WHEP架构WHIPWebRTC-HTTP Ingestion Protocol与 WHEPWebRTC-HTTP Egress Protocol是 IETF 标准化的 HTTP 信令协议一个用于推流ingest一个用于拉流playback。ZLMediaKit 将其作为 SFU 模式的信令实现WebRTC SFU 模式 (WHIP/WHEP) 推流端 (WHIP) 拉流端 (WHEP) ---------------- ----------------- | Encoder | | Player | | (Browser/ZLM) | | (Browser/ZLM) | ---------------- ----------------- | | | WHIP Protocol | WHEP Protocol | (WebRTC ingest) | (WebRTC playback) | | v v ------------------------------------------------------------------- | ZLMediaKit Server | ------------------------------------------------------------------- - WHIP: WebRTC-HTTP Ingestion Protocol (推流) - WHEP: WebRTC-HTTP Egress Protocol (拉流)媒体流统一汇聚到 ZLMediaKit 的流媒体管道MultiMediaSourceMuxer多协议复用因此 WHIP 推入的流可以同时被 RTSP、RTMP、HLS 等其他协议拉取这是 SFU 模式下“多路复用”的直接体现。2. P2P 模式WebSocket 信令架构P2P 模式基于 ZLMediaKit 自定义的 WebSocket 信令协议。客户端 A/B 与服务器之间通过 WebSocket 交换 SDP Offer/Answer 与 ICE Candidate最终媒体直接点对点传输WebRTC P2P 模式 客户端 A 客户端 B ------------ ------------- | Browser/ZLM| | Browser/ZLM | ------------ ------------- | | | 1. 信令交换 (SDP Offer/Answer) | | 2. ICE Candidate 交换 | ---------------- ---------------------------- | | | | ----------------------- | | | ZLMediaKit Server | | | | 信令服务器 (WebSocket) | | | | STUN 服务器 | | | | TURN 服务器 | | | ----------------------- | | | ----------------------------------------------- 直接P2P连接在 P2P 模式下服务器承担三份职责WebSocket 信令转发、STUN打洞探测公网地址、TURNRelay 兜底转发。当两端无法建立直连对称 NAT 等时ICE 会回落到 TURN Relay此时portRange端口池conf/config.ini中为port_range49152-65535开始生效。从源码看P2P 模式的房间归属由WebRtcSignalingPeer管理客户端通过checkIn(peer_room_id, ...)登记到目标房间并触发呼叫请求sendCallRequest离开时调用checkOut(peer_room_id)发送 Bye 通知相关逻辑见 webrtc/WebRtcSignalingPeer.cpp 与 webrtc/WebRtcClient.cpp。二、WebRTC URL 格式与信令协议参数无论是拉流代理还是推流代理WebRTC 源/目标 URL 都遵循统一格式并通过 query 参数选择信令模式。1. WHIP/WHEP 模式SFU——signaling_protocols0标准 HTTP 信令协议为默认模式WebRtcClient.h中_signaling_protocols默认值即WHEP_WHIP# HTTP webrtc://server_host:server_port/app/stream_id?signaling_protocols0 # HTTPS暂未实现 webrtcs://server_host:server_port/app/stream_id?signaling_protocols02. WebSocket P2P 模式——signaling_protocols1基于 WebSocket 的自定义信令协议需额外指定目标房间# WebSocket webrtc://signaling_server_host:signaling_server_port/app/stream_id?signaling_protocols1peer_room_idtarget_room_id # WebSocket Secure暂未实现 webrtcs://signaling_server_host:signaling_server_port/app/stream_id?signaling_protocols1peer_room_idtarget_room_id注意在curl -d表单提交中必须做 URL 编码%26否则会被 shell 或表单解析器误认为多个参数详见下文请求示例。3. 参数对照表参数取值含义说明signaling_protocols0WHIP/WHEP 模式默认基于 HTTP 的标准 WebRTC 信令SFU 场景适合广播与多人会议signaling_protocols1WebSocket P2P 模式基于 WebSocket 的自定义信令点对点直连适合低延迟通话与私人通信peer_room_id任意字符串P2P 目标房间 ID仅 P2P 模式需要对应WebRtcSignalingPeer::checkIn的peer_room_id入参从源码角度印证URL 解析位于 webrtc/WebRtcClient.cpp客户端读取peer_room_id与signaling_protocols后在 webrtc/WebRtcClient.cpp 中按协议类型分发到WEBSOCKET或WHEP_WHIP分支未识别的协议值直接抛出not support signaling_protocols异常。三、WebRTC 房间管理 HTTP APIP2P 模式依赖“房间保持器Room Keeper”把本地房间注册到远端信令服务器。相关 API 统一挂在 ZLMediaKit 的 HTTP API 体系下实现在 server/WebApi.cpp均要求secret鉴权即CHECK_SECRET()。1. 添加房间保持器POST /index/api/addWebrtcRoomKeeper在指定信令服务器上维持一个房间连接注册后信令服务器会对room_id做唯一性检查。请求参数参数说明secret接口访问密钥server_host信令服务器主机地址server_port信令服务器端口room_id房间 ID信令服务器对该 ID 进行唯一性检查调用链addWebrtcRoomKeeper(server_host, server_port, room_id, ssl)→ 通过WebRtcSignalingPeer建立 WebSocket 连接并注册房间。成功返回data.room_key房间保持器唯一标识该值在删除接口中要用到。2. 删除房间保持器POST /index/api/delWebrtcRoomKeeper删除指定信令服务器上的房间保持器。请求参数参数说明secret接口访问密钥room_key房间保持器的唯一标识符由添加接口返回3. 列出所有房间保持器POST /index/api/listWebrtcRoomKeepers请求参数仅secret。返回每个房间保持器对应WebRtcSignalingPeer的 JSON 序列化信息ToJson(p)并附加room_key字段。4. 列出活跃的 WebRTC 房间会话POST /index/api/listWebrtcRooms请求参数仅secret。枚举当前所有活跃的WebRtcSignalingSessionPeer 会话返回项附加room_id字段。会话对象维护于WebRtcSignalingSession的全局注册表中见 webrtc/WebRtcSignalingSession.cpp。5. 查询 WebRTC 代理播放器信息POST /index/api/getWebrtcProxyPlayerInfo获取 WebRTC 代理播放器的连接信息和状态。请求参数参数说明secret接口访问密钥key代理播放器标识符实现要点server/WebApi.cpp通过key找到WebRtcProxyPlayerImp并取其WebRtcTransport异步调用getTransportInfo返回 ICE 候选、连接状态等传输信息若 key 不存在返回NotFound若代理不是 WebRTC 类型返回OtherFailed。四、WebRTC 拉流与推流代理 APIZLMediaKit 复用标准的流代理接口addStreamProxy/addStreamPusherProxy创建 WebRTC 拉流与推流两种信令模式均可通过 URL 参数切换。1. 创建 WebRTC 拉流代理POST /index/api/addStreamProxy参数说明secret接口访问密钥vhost虚拟主机名默认为__defaultVhost__app应用名stream流 IDurlWebRTC 源 URL支持上述两种格式WHIP/WHEP 模式拉流示例curl -X POST http://127.0.0.1/index/api/addStreamProxy \ -d secretyour_secret \ -d vhost__defaultVhost__ \ -d applive \ -d streamtest \ -d urlwebrtc://source.server.com:80/live/source_stream?signaling_protocols0P2P 模式拉流示例注意编码为%26curl -X POST http://127.0.0.1/index/api/addStreamProxy \ -d secretyour_secret \ -d vhost__defaultVhost__ \ -d applive \ -d streamtest \ -d urlwebrtc://signaling.server.com:3000/live/source_stream??signaling_protocols1%26peer_room_idtarget_room_id拉流代理在服务端对应WebRtcProxyPlayer继承PlayerProxy体系通过WebRtcPlayer内部创建WebRtcTransport并完成信令握手最终把 WebRTC 流接入本地媒体管道。2. 创建 WebRTC 推流代理暂未实现POST /index/api/addStreamPusherProxy注意该接口当前尚未实现USAGE.md明确标注“暂未实现”也列入文末未实现功能清单此处仅给出约定中的接口契约与参数供后续版本参考参数说明secret接口访问密钥schema源流协议如 rtmp、rtsp、hls 等vhost虚拟主机名app应用名stream源流 IDdst_urlWebRTC 目标推流 URL约定中的 WebRTC 推流 URL 格式与拉流一致WHIP 模式SFU——推流到支持 WHIP 的服务器# HTTP webrtc://target_server:port/app/stream_id?signaling_protocols0 # HTTPS暂未实现 webrtcs://target_server:port/app/stream_id?signaling_protocols0WebSocket P2P 模式——推流到 P2P 房间# WebSocket webrtc://signaling_server:port/app/stream_id?signaling_protocols1peer_room_idtarget_room # WebSocket Secure webrtcs://signaling_server:port/app/stream_id?signaling_protocols1peer_room_idtarget_room约定的请求示例# 将RTSP流推送到WHIP服务器 curl -X POST http://127.0.0.1/index/api/addStreamPusherProxy \ -d secretyour_secret \ -d schemartsp \ -d vhost__defaultVhost__ \ -d applive \ -d streamtest \ -d dst_urlwebrtc://target.server.com:80/live/target_stream?signaling_protocols0 # 将RTSP流推送到P2P房间 curl -X POST http://127.0.0.1/index/api/addStreamPusherProxy \ -d secretyour_secret \ -d schemartsp \ -d vhost__defaultVhost__ \ -d applive \ -d streamtest \ -d dst_urlwebrtc://signaling.server.com:3000/live/room_stream?signaling_protocols1%26peer_room_idtarget_room_id五、[rtc]配置段详解WebRTC 相关配置全部位于config.ini的[rtc]段。以下配置来自 conf/config.ini并交叉核对 webrtc/WebRtcTransport.cpp 中Rtc命名空间的默认值与字段定义[rtc] #webrtc 信令服务器端口 signalingPort3000 #STUN/TURN服务器端口 icePort3478 #STUN/TURN端口是否使能TURN服务 enableTurn1 #TURN服务分配端口池 portRange50000-65000 #ICE传输策略0不限制(默认)1仅支持Relay转发2仅支持P2P直连 iceTransportPolicy0 #UDP ICE会话空闲超时时间单位秒0为关闭 iceSessionTimeoutSec60 #STUN/TURN 服务Ice密码 iceUfragZLMediaKit icePwdZLMediaKit各配置项说明与源码对应配置项说明源码默认值signalingPortWebRTC 信令服务器WebSocket监听端口0源码默认关闭见 WebRtcTransport.cppicePortSTUN/TURN 服务器 UDP 端口0默认关闭enableTurnSTUN/TURN 端口是否使能 TURN 服务1开启1portRangeTURN 服务分配端口池仓库config.ini中为port_range49152-65535iceTransportPolicyICE 传输策略0不限制默认、1仅 Relay 转发、2仅 P2P 直连0iceSessionTimeoutSecUDP ICE 会话空闲超时秒0关闭60iceUfrag/icePwdSTUN/TURN 服务 ICE 凭证ZLMediaKit/ZLMediaKit源码层面的深层解读配置注册与默认值Rtc命名空间在 webrtc/WebRtcTransport.cpp 通过onceToken统一注册上述所有字段的默认值例如kSignalingPort 0、kIcePort 0、kEnableTurn 1、kIceTransportPolicy 0、kIceSessionTimeoutSec 60、kIceUfrag kIcePwd ZLMediaKit。这意味着即使config.ini未显式配置进程内也有一套可用的兜底值。端口 0 即关闭服务端读取signalingPort、icePort后仅在非 0 时启动对应服务server/main.cpp。因此生产环境必须显式把端口配为非 0否则 WebRTC 信令与 STUN/TURN 服务不会监听。ICE 凭证的下发WebRtcSignalingSession在生成ice_serversSTUN/TURN 服务器列表时读取icePort、iceUfrag、icePwd并拼接turn://或stun://URL 下发给客户端webrtc/WebRtcSignalingSession.cppIceSession则用同一份 ufrag/pwd 校验入站 STUN 请求webrtc/IceSession.cpp。修改凭证时务必保持两端一致。其它相关配置[rtc]段还有portWebRTC 单端口 UDP 服务器默认 8000、tcpPort、signalingSslPort、iceTcpPort、timeoutSecRTP/RTCP 接收超时默认 15 秒、externIP服务器外网 IP用于生成正确的 ICE 候选等均可在 conf/config.ini 与 webrtc/WebRtcTransport.cpp 中查阅。六、防火墙与部署注意事项WebRTC 依赖大量 UDP 端口部署时务必在防火墙/安全组中放行信令端口3000默认对应signalingPort供 WebSocket 信令连接STUN/TURN 端口3478默认对应icePort供 STUN 打洞探测与 TURN 分配请求TURN Alloc 端口范围50000-65000默认对应portRangeTURN Relay 实际转发媒体所用的动态端口池仓库 conf/config.ini 中该项名为port_range49152-65535以当前仓库实际配置为准。此外还应注意媒体端口WebRTC 媒体默认由[rtc] portUDP默认 8000与tcpPort承载需一并放行外网部署服务器在 NAT 后时需配置externIP否则 ICE 候选中的地址是内网地址客户端无法连通P2P 打洞失败兜底若双方 NAT 类型无法打洞成功媒体会经 TURN Relay 转发此时 TURN 端口池的容量直接决定并发上限。七、参考示例与未实现功能清单官方参考示例USAGE.md提供了一个基于 libwebrtc 实现的 P2P 代理拉流简单示例zlm_peerconnection可用于快速验证 P2P 模式的信令流程与房间机制。仓库内的webrtc/目录还包含WebRtcPlayer、WebRtcPusher、WebRtcProxyPlayer、WebRtcProxyPusher、WebRtcTalk、WebRtcEchoTest等完整客户端/服务端实现www/webrtc/ZLMRTCClient.js提供了浏览器端 JavaScript 客户端可作为二次开发的起点。暂未实现的功能当前版本以仓库实际代码为准以下功能尚不支持请勿在文档中当作可用能力WebRTC 信令服务的安全校验WebSocket 信令缺少鉴权自定义外部 STUN/TURN 服务器的配置当前 STUN/TURN 由 ZLMediaKit 内置提供WebRTC 代理推流addStreamPusherProxy接口尚未实现HTTPS/WSS 信令URL 中的webrtcs://标记为“暂未实现”。八、总结ZLMediaKit 的 WebRTC 能力围绕“双信令模式”展开signaling_protocols0走标准 WHIP/WHEP HTTP 信令实现 SFU 中继signaling_protocols1走 WebSocket 自定义信令实现 P2P 房间直连通过addStreamProxy、房间管理系列 API 与[rtc]配置段可以组合出广播、会议、点对点通话等多种拓扑。部署时牢记三点信令端口、STUN/TURN 端口与 TURN 端口池必须放行端口为 0 的服务不会启动外网环境务必配置externIP。如需深入源码建议从 server/main.cpp服务启动、webrtc/WebRtcSignalingPeer.cpp房间信令、webrtc/WebRtcClient.cppURL 解析与协议分发三个文件入手。赞分享音视频直播后端【免费下载链接】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点击查看免费下载相关推荐SRS WebRTC 实战指南WHIP/WHEP 推拉流、Candidate 配置与 SFU 架构详解SRS WebRTC 实战指南WHIP/WHEP 推拉流、Candidate 配置与 SFU 架构详解 导读 WebRTC 是 Google 开源的浏览器实时音视频后端直播DLSS Swapper 上手指南不等游戏更新也能换 DLSS 版本DLSS Swapper 上手指南不等游戏更新也能换 DLSS 版本 DLSS Swapper 是一款免费开源的 Windows 工具能把游戏里的 DLSS桌面应用RT-Thread RTC 设备驱动框架详解时间设置、date 命令与 Soft RTC 使用指南RT Thread RTC 设备驱动框架详解时间设置、date 命令与 Soft RTC 使用指南 RT Thread 的 RTC实时时钟设备为操作系统的操作系统嵌入式物联网嵌入式OSRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考