一种一次性热备用 TCP 连接,解决 NAT 下 ZLMediaKit 拉流建连超时、失败问题的方法

一种一次性热备用 TCP 连接,解决 NAT 下 ZLMediaKit 拉流建连超时、失败问题的实用方法

文章目录

  • [一种一次性热备用 TCP 连接,解决 NAT 下 ZLMediaKit 拉流建连超时、失败问题的实用方法](#一种一次性热备用 TCP 连接,解决 NAT 下 ZLMediaKit 拉流建连超时、失败问题的实用方法)
    • 前言
    • 一、业务场景与真实痛点
    • 二、底层硬性约束,所有设计不能绕开
      • [约束 1:D 公网中继不能主动 connect A](#约束 1:D 公网中继不能主动 connect A)
      • [约束 2:ZLMediaKit 每一次拉流,都是全新独立 TCP 会话](#约束 2:ZLMediaKit 每一次拉流,都是全新独立 TCP 会话)
      • [约束 3:4G 弱网环境,现场建连风险很高](#约束 3:4G 弱网环境,现场建连风险很高)
    • 三、各个角色完整定义
      • [A:NAT 内网嵌入式 RTSP 采集设备](#A:NAT 内网嵌入式 RTSP 采集设备)
      • [D:公网中继服务器,运行 warm‑relay 中继程序](#D:公网中继服务器,运行 warm‑relay 中继程序)
      • [ZLM(ZLMediaKit 流媒体服务)](#ZLM(ZLMediaKit 流媒体服务))
      • [E:移动终端,VLC 播放器](#E:移动终端,VLC 播放器)
    • [四、warm 热备通道完整工作时序](#四、warm 热备通道完整工作时序)
      • [阶段 1:系统待机,没有任何播放请求](#阶段 1:系统待机,没有任何播放请求)
      • [阶段 2:用户手机 E 打开 VLC,发起播放请求](#阶段 2:用户手机 E 打开 VLC,发起播放请求)
      • [阶段 3:用户停止 VLC 播放,会话结束](#阶段 3:用户停止 VLC 播放,会话结束)
    • 五、端口与五元组原理深度解析
    • 六、边界异常与故障场景分析
      • [场景 1:4G 网络抖动,待机状态下热备用隧道意外断开](#场景 1:4G 网络抖动,待机状态下热备用隧道意外断开)
      • [场景 2:拉流过程中,A‑D 业务隧道中途断开](#场景 2:拉流过程中,A‑D 业务隧道中途断开)
      • [场景 3:D 服务器临时端口池耗尽](#场景 3:D 服务器临时端口池耗尽)
      • [场景 4:ZLM 与 D 分开部署,跨公网访问 D:10554](#场景 4:ZLM 与 D 分开部署,跨公网访问 D:10554)
    • [七、warm 隧道与其他方案横向对比](#七、warm 隧道与其他方案横向对比)
    • 八、生产部署注意要点
    • 九、总结

关键词:4G‑NAT、嵌入式 RTSP、warm 隧道、ZLMediaKit、热备用 TCP、反向隧道、VLC 播放

前言

做物联网视频项目的朋友大概率会碰到一类经典痛点:4G Cat.1 的嵌入式智能AI眼镜、采集设备,挂在运营商 NAT 后面,没有公网 IP。设备本地已经输出标准 RTSP 音视频流,但是外面公网的流媒体服务器就是连不进来。外部不能主动叩开内网设备的大门,这是 NAT 网络与生俱来的特性。

很多人的选型思路是上 FRP、cloudflared 这类现成反向隧道。但是当硬件资源被卡死,比如 网络IP摄像机、智能AI眼镜 这类嵌入式平台,整机内存只有 30MB,跑 BusyBox 极简系统,没有内核 WireGuard 模块,大体积的隧道客户端根本跑不起来。编译移植困难,内存吃紧,现成方案直接被硬件门槛挡死。

那我们就需要一套轻量化自定义反向隧道,本文介绍的 warm 热备隧道 ,核心思路:预建一次性热备用 TCP 连接,专门解决 NAT 环境中 ZLMediaKit 拉流出现的建连超时、偶发拉流失败问题。整套方案完全运行在用户态,不需要内核模块,二进制体积小,适配低资源嵌入式设备。

整套系统一共四个参与角色:A(NAT 内网嵌入式 RTSP 设备)、D(公网中继服务器)、ZLM(ZLMediaKit 流媒体服务)、E(移动端 VLC 播放器)。完整业务链路:E (VLC 移动端) ↔ ZLMediaKit ↔ D 公网中继 ↔ A 嵌入式 RTSP 设备。下面从真实业务痛点、底层网络约束、方案原理、端口模型、完整时序、故障边界、方案对比、落地部署完整讲清楚这套 warm 热备通道实现音视频播放的完整方法。

一、业务场景与真实痛点

现在大量物联网视频终端,采用 4G Cat.1 模组联网,硬件平台 ISP AI平台,运行裁剪版 BusyBox Linux。设备本地采集音视频,内部启动 RTSP 服务,监听本机回环地址127.0.0.1:554输出 RTSP 流。注意这个 RTSP 服务只绑定回环,设备网卡本身不对外开放 RTSP 端口。

设备接入运营商 4G 网络之后,被分配内网 IP,处于大 NAT 之后。运营商 NAT 网关有一条铁则:外部网络不能主动向内网设备发起 TCP 连接。任何从公网过来、目标指向 A 设备的 TCP 握手报文,直接被 NAT 网关丢弃。公网的服务器,无论如何 connect A,都不可能建立 TCP 链路。

业务诉求很直白:手机上的 VLC 播放器,能够远程实时播放这台 4G 内网设备的音视频画面。

常规架构,会引入 ZLMediaKit 作为流媒体中间件。ZLMediaKit 负责拉取源 RTSP 流,完成 RTSP 信令解析、RTP 解封装、媒体转发,再对外输出流,手机 VLC 去连接 ZLMediaKit 做播放。但最大障碍就是:ZLM 部署在公网,无法直接访问 NAT 后方 A 设备上的 RTSP 服务,必须依靠反向隧道中转数据。

市面上成熟反向隧道方案不少:FRP、cloudflared tunnel。但它们并不适配 智能AI眼镜 这类硬件。FRP 客户端是 Go 编译出来,二进制体积大,内存占用高;cloudflared 同样资源开销巨大,还依赖 QUIC、HTTP2 协议栈。对于 30MB 内存的嵌入式设备,跑起来压力巨大,交叉编译移植工作量也很大。VPN 类的 Cloudflare WARP 更加不适合,WARP 是正向出站 VPN,不是反向隧道,不能用来暴露内网 RTSP 服务,同时 WireGuard 依赖也给嵌入式带来很高移植成本。

所以我们自研 warm 隧道,核心创新点:预建一次性热备用 TCP 连接。提前把 A 到 D 的 TCP 通路建好,放在中继服务器 D 的待嫁队列待命。当 ZLMediaKit 拉流请求到达的时候,直接拿已经建好的隧道做字节桥接,不再现场去建立 TCP 连接,以此规避 TCP 三次握手带来的时延,规避弱网环境动态建连失败导致的拉流超时。

二、底层硬性约束,所有设计不能绕开

在写方案逻辑之前,先把几条不可突破的网络约束摆出来,warm 隧道全部设计都是围绕这几条约束展开,如果忽略这些条件,方案就会完全不成立。

约束 1:D 公网中继不能主动 connect A

A 设备处于运营商 4G NAT 后面。只有 A 主动向外发起 TCP 连接,NAT 网关才会生成临时端口映射,这条连接的双向报文才可以通行。一旦连接断开,NAT 映射表项超时回收,外部又彻底无法触达 A。D 拥有公网 IP,但是 D 发起 connect (A) 的报文会直接被运营商 NAT 丢弃,完全无法建立连接。

结论:A‑D 之间所有 TCP 连接,发起方必须是 A 设备

约束 2:ZLMediaKit 每一次拉流,都是全新独立 TCP 会话

ZLMediaKit 每一次拉取 RTSP 流,都会新建一条独立 TCP 连接。RTSP 整套信令 OPTIONS、DESCRIBE、SETUP、PLAY,以及 Interleaved 封装的 RTP 音视频数据,全部跑在同一条 TCP 连接上面。拉流会话生命周期和这条 TCP 强绑定

当用户停止 VLC 播放、网络抖动断流、流结束的时候,ZLMediaKit 就会关闭这条 TCP socket,整个会话直接销毁。

这里有一个非常关键的点:单条 TCP 连接,只能服务一次拉流。会话结束,这条连接不能复用给下一次拉流

如果试图用一条长连接隧道,反复服务多次 ZLM 拉流,新旧 RTSP 信令、RTP 数据会混杂在一起,协议状态错乱,现象就是花屏、黑屏、反复播放失败、信令报错。所以 "一条长隧道复用多次拉流" 这条路走不通。

约束 3:4G 弱网环境,现场建连风险很高

我们可以设想一个简单的简易方案:平时 A 和 D 之间没有连接;当 ZLM 拉流请求抵达 D 之后,D 下发通知,让 A 此时此刻才去 connect D 建立 TCP,建连完成之后再桥接数据。

逻辑上好像说得通,但放到 4G 物联网真实环境,问题非常突出。

第一,会引入 TCP 三次握手完整时延。ZLM 发出拉流请求,不能立刻拿到媒体数据,需要等待 A 完成 DNS 解析、TCP 三次握手。4G 网络波动场景下,这个时延会被放大,直接触发 ZLM 内部拉流超时阈值,本次播放直接失败。

第二,无线网络存在丢包、信号波动,此时触发 A 现场建连,TCP 握手报文丢失,直接建连失败,这一次用户播放直接报错。用户点击播放,直接看不到画面,产品体验很差。

基于以上三条约束,就引出 warm 隧道核心思路:不要等 ZLM 拉流来了才临时建 A‑D 连接。提前预建一条 A 到 D 的 TCP 热备用连接,放在 D 中继的待嫁队列里面待命。拉流请求到来直接拿来使用;这条隧道是一次性的,使用完毕直接销毁,A 设备立刻重新建立一条全新的备用连接继续待命。

三、各个角色完整定义

A:NAT 内网嵌入式 RTSP 采集设备

硬件为 智能AI眼镜,BusyBox 精简 Linux,内存约 30MB,4G Cat.1 上网,无公网 IP。

  1. 本地 RTSP 服务监听回环地址127.0.0.1:554,仅本机内部程序可以访问,外部网络无法访问该端口。

  2. 运行 warm‑client 客户端程序,全部用户态实现,C socket+select,二进制体积很小,内存占用小于 1MB,不需要内核模块。

  3. 客户端行为:持续主动向外对公网 D 的 9001 端口发起 TCP 连接。成功建立的 TCP 连接作为热备用隧道,交给 D 中继。

  4. 连接状态:同一时刻 A 最多维持一条 A‑D 的 TCP 连接。这条连接要么处于空闲待命(热备用未认领),要么正在业务拉流。

  5. 重连逻辑:一旦 TCP 连接断开,客户端死循环,间隔 1 秒重新发起 connect (D:9001),生成全新 TCP 连接,继续作为热备用。

  6. 隧道被认领业务时,warm‑client 把中继过来的数据转发给本机127.0.0.1:554RTSP 服务;把 RTSP 返回的音视频字节原样回传给 D 中继。

  7. A 这边所有向外的 TCP 连接,源端口全部是操作系统分配的随机临时端口,A 本机不开启任何对外监听端口。

D:公网中继服务器,运行 warm‑relay 中继程序

拥有公网 IP,中继程序 warm‑relay 核心职责:接收 A 设备的隧道接入,维护待嫁队列,接收 ZLM 的拉流 TCP,做 socket 字节桥接。

  1. 监听端口0.0.0.0:9001:专门接收 A 设备主动过来的 warm 隧道 TCP 接入。9001 是监听端口,不会被业务连接消耗。

  2. 监听端口0.0.0.0:10554:接收 ZLMediaKit 的拉流 TCP 接入。该监听端口同时支持本机回环访问,也支持外部公网访问。

  3. 内部维护待嫁队列(asyncio.Queue),队列存放已经连通、尚未被认领消费的 A‑D 热备用 TCP socket。业务规则:队列最多保存一条备用隧道。

  4. 桥接逻辑:当 ZLM 的拉流 TCP 到达 D,relay 从待嫁队列取出空闲 A‑D 隧道 socket,把 ZLM‑D socket 和 A‑D socket 做透明字节桥接。relay 只做字节搬运,不解析 RTSP、不解析 RTP 音视频载荷,完全透传原始字节流。

  5. 隧道一次性消费:一旦完成一次拉流业务,整套两条 socket 全部关闭。被使用过的 A‑D 隧道不会回收回队列。A 检测断开,马上新建下一条备用连接送入队列。

  6. 端口模型:9001、10554 仅仅是 listen 监听入口;每一条实际业务连接,消耗服务器操作系统的临时端口池。连接关闭后 socket 进入 TIME_WAIT,操作系统后续回收临时端口资源。

重点解释本机访问 127.0.0.1:10554 端口原理:

如果 ZLM 部署在 D 同一台服务器,ZLMediaKit 作为 TCP 客户端,目标地址写127.0.0.1:10554

10554 是 relay 的监听目的端口,ZLM 本机操作系统分配一个随机临时源端口发起连接。TCP 五元组(源IP:源端口,目的IP:目的端口)唯一标识一条连接。accept 之后生成的业务 socket 使用 D 系统随机临时端口,并不会占用、消耗监听端口 10554。监听端口持续存在,可以继续接收下一条 ZLM 连接。这也是同一台机器上 ZLM 可以反复多次连接 10554 的底层原理。

ZLM(ZLMediaKit 流媒体服务)

部署位置二选一:①和 warm‑relay 共同部署在 D 公网服务器;②部署在另一台独立公网服务器。

  1. 如果部署在 D 本机,ZLM 访问目标填写rtsp://127.0.0.1:10554/stream,走本机回环 TCP,不走物理网卡,没有额外公网带宽开销,优先推荐该部署方式。

  2. 如果部署在外部另一台公网服务器,则填写 D 公网 IP:10554,流量经过公网传输,会增加网络抖动风险。

  3. ZLM 每一次发起播放,都会新建一条独立 TCP 连接访问 D 的 10554 端口。拉流会话和 TCP 生命周期绑定。

  4. ZLM 负责完整 RTSP 信令交互,接收透传过来的 Interleaved RTP 音视频数据,完成解封装、媒体缓存,对外输出媒体流,供前端播放器访问。

  5. 用户停止播放、网络异常,ZLM 主动关闭 TCP 连接,整条会话结束。

E:移动终端,VLC 播放器

手机端 VLC 播放器,作为最终播放端。

  1. E 不直接访问 D 中继服务器,而是连接 ZLMediaKit 提供的媒体地址。

  2. 用户点击播放,VLC 新建会话向 ZLM 请求音视频流;停止播放则会话断开。

  3. 本身完全不知道背后 warm 隧道整套机制,只消费 ZLM 输出的标准媒体流。

完整链路分两种部署形态:

形态 1(ZLM 与 D 同机,推荐)

E(VLC手机) ↔(公网)↔ ZLMediaKit(D本机) ↔(本机回环TCP)↔ warm‑relay(D:10554) ↔(4G公网)↔ A(NAT嵌入式设备)

形态 2(ZLM 独立另外一台公网服务器)

E(VLC手机) ↔ ZLMediaKit(独立公网机) ↔(公网)↔ warm‑relay(D公网中继) ↔(4G公网)↔ A(NAT嵌入式设备)

四、warm 热备通道完整工作时序

我们以最推荐的形态 1,ZLM 部署 D 本机为例,完整走一遍从待机,到用户手机 VLC 播放,再到停止播放全流程。

阶段 1:系统待机,没有任何播放请求

  1. A 设备上电启动,warm‑client 开始循环执行 connect (D:9001)。TCP 握手成功,生成 A‑D 热备用 TCP 连接。A 本机是随机临时端口出站。

  2. A‑D 这条 TCP 连接传输层已经打通,此时没有业务数据。A 把这条连接交给 D 中继服务器。

  3. D 上 warm‑relay 收到 accept 事件,拿到这条 A‑D socket,放入待嫁队列,状态标记为 "未被认领,空闲热备用"。此刻队列里面保存唯一一条预建好的隧道。

  4. A 这边维持这条 TCP 连接。如果这条连接因为 4G 网络抖动断开,A 客户端 1 秒之后立刻重新 connect D,生成全新 TCP 连接,再次送入 D 的待嫁队列。保证尽量队列里面始终有一条可用备用隧道。

  5. D 这边,10554 端口处于 listen 监听状态,暂时没有来自 ZLM 的接入。手机 E 端 VLC 没有发起播放。系统处于待命状态。

关键点:播放请求还没有发生,A 到 D 的通路已经提前就绪。

阶段 2:用户手机 E 打开 VLC,发起播放请求

  1. 用户在手机 VLC 填入 ZLM 的媒体地址,点击播放。VLC 向 ZLMediaKit 发起请求。

  2. ZLMediaKit 收到播放请求,触发拉流逻辑,作为 TCP 客户端发起 connect (127.0.0.1:10554)。操作系统分配本机随机源端口,建立 ZLM‑D 本机回环 TCP 连接。

  3. warm‑relay accept 拿到 ZLM 这条新 socket。立刻检查待嫁队列,取出里面预先已经建好的 A‑D 空闲热备用 socket。

  4. relay 执行字节桥接逻辑:把 ZLM‑D socket 收到的字节原样转发给 A‑D socket;A‑D socket 收到的字节原样转发给 ZLM‑D socket。全程不解析 RTSP 信令,不解析音视频载荷,纯透明字节拷贝。

  5. 此时两条 socket 配对完成,正式业务链路打通。ZLM 开始收到 RTSP 信令以及 RTP 音视频数据。

  6. ZLM 完成 RTSP 交互,接收音视频,封装媒体流输出给手机 VLC,E 端 VLC 正常渲染画面、播放声音,用户看到视频。

这里核心收益:ZLM 拉流到来之时,A‑D 的 TCP 三次握手早已完成。省去现场建连带来的握手时延,规避 4G 弱网现场建连失败导致播放直接超时失败。

阶段 3:用户停止 VLC 播放,会话结束

  1. 用户关闭 VLC 播放器,E 断开和 ZLM 之间会话。ZLMediaKit 检测到播放结束,主动关闭它与 D:10554 之间的 TCP socket。

  2. warm‑relay 检测 ZLM 侧 socket 关闭,立刻同时关闭对应的 A‑D 隧道 socket。这条曾经作为热备用的隧道直接销毁,不会放回待嫁队列复用。

  3. A 设备的 warm‑client 检测到 A‑D socket 断开,立刻触发重连逻辑,间隔 1 秒向 D:9001 发起 connect,生成一条全新 TCP 连接,再次送入 D 的待嫁队列。系统回到阶段 1 待机状态,等待下一次手机播放请求。

隧道是一次性耗材:预建好,拿来用一次,用完直接扔掉,马上再生产新的备用隧道待命。

五、端口与五元组原理深度解析

很多开发者在这里容易产生误区:ZLM 连接 127.0.0.1:10554,会不会把 10554 端口占死,导致下一次拉流连不上?这里要分清监听端口和业务连接 socket。

TCP 连接依靠五元组唯一确定:(源IP,源端口,目的IP,目的端口)

  • 105549001是服务端监听端口,它只负责接收连接请求,本身不会被消耗。listen 端口就好比驿站大门,大门不会被来客占用。

  • ZLM 作为客户端访问127.0.0.1:10554,目的端口固定 10554;源端口由操作系统从临时端口池分配随机端口。

  • relay 调用 accept 得到的业务 socket,内核会分配 D 服务器上另外一个随机临时端口用于实际通信。监听端口 10554 依旧保持监听,继续接收下一条 ZLM 连接。

同样,A 设备主动连 D:9001,D 的 9001 是监听端口;accept 出来每一条 A‑D 业务连接,消耗 D 服务器随机临时端口。9001 监听端口不会被耗尽。

真正消耗系统资源的,是操作系统的临时端口池。每一条 TCP 业务连接占用一个临时端口。当连接关闭,socket 进入 TIME_WAIT 状态,等待一段时间之后操作系统回收临时端口。

在业务高频反复播放‑停止场景,会产生大量 TIME_WAIT。D 服务器生产部署时,需要针对 TCP 内核参数调优,缩短 TIME_WAIT 回收时间,避免临时端口耗尽导致后续拉流失败。

A 设备侧也一样:A 向外 connect D:9001,A 本机使用操作系统随机临时出站端口,A 设备没有开启任何对外监听端口,全部是出站连接。

六、边界异常与故障场景分析

场景 1:4G 网络抖动,待机状态下热备用隧道意外断开

A 到 D 的空闲热备用隧道,因为 4G 信号波动、运营商 NAT 超时,连接悄无声息断开。此时 D 的待嫁队列为空。

A 客户端检测 socket 断开,按照 1 秒间隔立刻重连。重连成功之后新的 TCP 送入队列。

风险窗口:隧道断开之后、重连完成之前,短暂时间队列为空。如果此时用户刚好打开 VLC 发起播放,D 队列拿不到可用 A‑D 隧道,本次拉流直接失败。

缓解方案:调小 A 端重连间隔;上层业务做播放重试逻辑。这是该方案固有的极小概率窗口,无法 100% 消除。

场景 2:拉流过程中,A‑D 业务隧道中途断开

正在播放视频的时候,4G 网络中断,A‑D 业务 socket 断开。relay 立刻关闭对 ZLM 的 socket,ZLM 拉流失败,手机 VLC 播放中断。A 马上重连建立新热备用隧道。需要用户重新触发 VLC 播放。

场景 3:D 服务器临时端口池耗尽

短时间高频反复播放停止,大量 TIME_WAIT 堆积,D 服务器临时端口耗尽。此时 ZLM 无法建立新 TCP 连向 10554,拉流全部失败。

对策:D 服务器调优 linux 内核 tcp 参数,加快 TIME_WAIT 回收。

场景 4:ZLM 与 D 分开部署,跨公网访问 D:10554

链路多一跳公网,会增加丢包、时延抖动,建议优先 ZLM 和 D 同机部署,走 <127.0.0.1> 回环访问。

七、warm 隧道与其他方案横向对比

方案 资源开销 是否反向隧道 是否需要公网中继 NAT 适配 本项目 智能AI眼镜 适配度
warm 热备隧道 极低,<1MB 内存 是,预建一次性热备用 TCP 需要自建 D 公网中继 适配 4G‑NAT ⭐⭐⭐⭐⭐
FRP 中,几十 MB 内存 自建中继 适配 ⭐⭐,硬件资源紧张难以运行
cloudflared tunnel 高,Go 大二进制 Cloudflare 边缘,无需自建中继 适配 ⭐,内存开销大,智能AI眼镜SOC 跑不动
Cloudflare WARP 中高 否,正向 VPN Cloudflare 边缘 NAT 上网 ⭐,不能暴露内网 RTSP,不解决业务问题

warm 隧道优势:极致轻量化,完全用户态,交叉编译简单,专门针对低资源嵌入式。代价是需要自己维护一台 D 公网中继服务器,没有内置加密,生产环境可以外层叠加 stunnel TLS 做加密加固。

八、生产部署注意要点

  1. A 端 warm‑client 重连间隔设置 1s,不要设置过大,尽量缩小队列为空的风险窗口。

  2. D 服务器内核 TCP 参数调优,处理 TIME_WAIT 堆积问题。

  3. warm‑relay 监听0.0.0.0:10554,ZLM 本机访问务必优先使用127.0.0.1:10554,不要使用 D 公网 IP 访问本机端口,避免经过物理网卡、安全组带来额外风险。

  4. warm 隧道本身 TCP 明文传输,如果公网链路有安全顾虑,可以套一层 stunnel 实现 TLS 加密,不需要改动隧道业务逻辑。

  5. ZLM 业务层增加播放失败自动重试,用来应对极小概率 "待嫁队列为空" 场景。

  6. A 设备 RTSP 服务绑定回环127.0.0.1:554,不要绑定网卡公网地址,保证不直接暴露 RTSP 端口。

九、总结

在 4G‑NAT 嵌入式视频场景,因为 D 不能主动连接 A、ZLM 每次拉流新建独立 TCP 会话,不能等到拉流请求到来才现场建立 A‑D 连接,现场建连会带来握手时延,弱网下直接拉流超时失败。

warm 隧道方案核心,预建一次性热备用 TCP 连接,提前把 A‑D 通路建好放在 D 中继待嫁队列待命。ZLM 拉流到达直接消费已经就绪的隧道;隧道使用完成直接销毁,A 立刻重建新备用连接。整套方案资源消耗极低,适配 智能AI眼镜SOC 这类内存紧张的嵌入式硬件,打通链路实现 ZLM 转发,最终手机 VLC 播放器可以正常播放 NAT 内网设备输出的音视频流。

相关推荐
霸道流氓气质2 个月前
ZLMediaKit 在Window上本地模拟预览报错排查教程
zlmediakit
山人在山上3 个月前
docker zlmediakit 部署
docker·zlmediakit
小杰3124 个月前
网络框架源码阅读技巧
服务器·网络·c++·reactor·zlmediakit·zltoolkit
珊瑚怪人5 个月前
分享一个Edge浏览器播放H265 RTSP流的问题,涉及到ZLMediaKit、WebRTC
音视频·视频·js·zlmediakit·视频流处理
小杰3125 个月前
ZLMediakit源码梳理
服务器·音视频·流媒体·zlmediakit
韩搏1 年前
ZLMediaKit性能测试
zlmediakit
byxdaz1 年前
ZLMediaKit 入门
zlmediakit
yunteng5211 年前
音视频(一)ZLMediaKit搭建部署
音视频·zlmediakit·安装搭建
程序员阿灿1 年前
ZLMediaKit 源码分析——[3] ZLToolKit 中EventPoller之网络事件处理
网络·webrtc·zlmediakit·zltoolkit