mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升
2026年10月10日mediamtx 发布 v1.21.2 最新版本。本次更新以“修复与改进”为主覆盖通用逻辑、API、Media-Over-QUIC、RTSP、RTMP、HLS、WebRTC 以及依赖库升级等多个方向。v1.21.2 没有引入新的功能模块而是集中处理实际运行中可能出现的连接异常、数据包丢失、内存占用、认证阻塞、并发竞争、死锁、播放器兼容性和异常请求导致崩溃等问题。对于使用 UDP、RTSP、RTMP、HLS、WebRTC、JWT 鉴权、API 配置管理的部署场景这一版本带来了更稳健的行为表现。版本信息版本v1.21.2发布时间2026年10月10日类型修复与改进版本通用改进优化 UDP、JWT、内存与 H264 处理本次更新首先对连接关闭、鉴权请求、空数据报和视频编码单元处理进行了调整。修复连接关闭时丢弃 UDP 数据包的问题此前在连接关闭过程中只要出现错误UDP 数据包就可能被丢弃而不考虑数据包自身大小。现在的逻辑变更为仅当 UDP 数据包为空且同时发生错误时才会将该数据包丢弃。这样可以避免连接关闭期间因错误状态导致正常 UDP 数据包被错误丢弃。该修复对应 6278。修正 YouTube RTMPS 地址文档文档中此前提供的 YouTube RTMPS 地址存在错误。v1.21.2 对该地址进行了修正同时明确指出当前不再需要配置指纹信息。该修复对应 6286。防止旧版凭据配置导致播放服务被无条件访问当系统使用旧版凭据字段时包括readUserreadPasspublishUserpublishPass此前播放服务可能会向所有访问者开放而不是仅向具备读取凭据的用户开放。v1.21.2 调整后播放服务仅允许使用 readUser 与 readPass 的用户获得访问权限从而避免旧版凭据场景下出现任何人都能访问播放服务的问题。该修复对应 6311。JWT 鉴权未携带令牌时不再请求 JWKS此前JWT 鉴权流程会在检查请求是否携带令牌之前先去获取 JWKS。这会导致匿名请求也触发向 JWKS 服务端发起外部请求。例如第一次未认证的 RTSP DESCRIBE 请求返回 401 之前的 HLS 请求其他没有携带 JWT 的匿名访问请求。更严重的是JWKS 获取过程发生在管理器写锁持有期间。如果 JWKS 服务响应缓慢、不可达或异常匿名客户端就可能不断触发外部 JWKS 请求并使所有 JWT 鉴权过程受到阻塞。v1.21.2 对此进行了优化如果请求没有携带 JWT直接返回“JWT 未提供”在确认请求携带 JWT 之前不再访问 JWKS增加 JWKS HTTP 响应状态码检查非 2xx 的 JWKS 响应将被直接拒绝。此前如果 JWKS 服务返回错误页程序可能会将错误页直接交给 JSON 解码器最终表现为不清晰的 JSON 解析错误。更极端的情况下如果错误响应恰好是合法 JSON该内容还可能被缓存为密钥集合一小时。现在非 2xx 响应会按状态码被明确拒绝。对于携带 JWT 且 JWKS 服务正常的请求原有行为保持不变。该修复对应 6274。修复可回退读取器可能造成内存耗尽的问题空 UDP 数据报可能导致不必要的条目分配从而增加内存消耗并可能引发 OOM 问题。v1.21.2 修复了空数据报导致无意义分配的情况避免这些空数据包不断创建不必要的内部对象。该修复来自 mediacommon 383。H264撤销对独立 SEI 单元的兼容处理此前曾针对独立 SEI 单元增加支持但此类单元现在会在更上游的位置被过滤因此不再需要在该位置继续兼容。v1.21.2 撤销了此前对独立 SEI 单元的支持逻辑。如果后续因此产生新的问题则需要通过问题反馈进行进一步调整。该变更来自 mediacommon 142 的回退以及 mediacommon 384。H264DTS 提取器支持 SEI 恢复点v1.21.2 的 DTS 提取器开始支持 H264 中的 SEI recovery point 消息。SEI recovery point 的负载类型为 6。现在系统会将其视为随机访问点其行为类似于 H265 中的 CRA。这样DTS 提取器可以从恢复点之后的第一个编码帧重新初始化自身状态。该改进对应 mediacommon 341。API 改进修复 RTSP 会话竞争、密码覆盖与关闭死锁API 相关更新主要处理并发操作、密码配置回写和 API 重载期间的死锁问题。修复踢出 RTSP 会话时的竞争条件当通过 API 踢出 RTSP 会话时系统此前可能发生竞争条件。v1.21.2 修复了该问题涉及 6260 与 6275。配置补丁不再将空字符串写入密码部分用户会调用/config/global/get获取配置内容再将返回结果提交给/config/global/patch。由于配置读取接口现在会对密码进行脱敏并将密码字段替换为这些空字符串如果被直接用于补丁更新就可能被当作实际密码写入导致认证被破坏。v1.21.2 调整后/config/global/patch会忽略值为的密码字段原本已经配置的密码将保持不变脱敏后的密码字段不会再意外覆盖真实密码。相关讨论地址为https://github.com/bluenviron/mediamtx/issues/6287该修复涉及 6141 与 6292。修复 API 重载期间的死锁此前当 API 正在关闭时某个/config接口请求可能正在等待服务端回复。与此同时服务端在关闭 API 时又会等待全部 API 接口请求结束从而形成相互等待/config请求等待服务端响应服务端等待 API 请求返回API 请求无法结束服务端关闭流程无法继续。v1.21.2 通过在 API 关闭时取消 API 接口到服务端的请求解决了这一死锁问题。该修复涉及 6280、6279 和 6310。Media-Over-QUIC 改进目录轨道名称标准化Media-Over-QUIC 中的 catalog 轨道名称此前为.catalog。该名称不符合标准。v1.21.2 将 catalog 轨道名称调整为catalog该修复对应 6268。RTSP 改进读取错误、UDP 缓冲区、SEI 单元与 JPEG RTP 支持RTSP 部分包含多个稳定性和兼容性改进涉及读取错误处理、静态源参数生效时机、错误返回码、H264/H265 数据过滤及 RTP/JPEG 实现。出现读取错误时停止转发此前RTSP 数据在出现读取错误后转发流程可能仍继续进行。v1.21.2 调整为一旦发生读取错误停止继续转发。该修复对应 6266。路径级 rtspUDPReadBufferSize 首次连接立即生效RTSP 静态源此前会先创建客户端再读取路径级别的rtspUDPReadBufferSize配置。这会导致该配置无法在第一次连接时生效而是要等到后续重新连接时才会传递给客户端。v1.21.2 将该参数的计算时机提前到客户端创建之前使路径级rtspUDPReadBufferSize在第一次连接时即可生效。这一行为与 MPEG-TS 源、RTP 源的处理方式保持一致也恢复了此前某次修改之前的行为。该修复对应 6291。调整部分 RTSP 方法的错误返回码RTSP 服务端部分方法的错误返回码进行了调整。该改动来自 gortsplib 1091 与 1174。过滤独立存在的 H264/H265 尾随 SEI 单元部分摄像机可能生成非标准的 H264/H265 访问单元。这类访问单元仅包含一个 SEI 单元并且该 SEI 位于其他单元之后。这类数据会给下游组件带来多个问题包括DTS 提取器处理异常录像模块处理异常H264/H265 数据流解析兼容性下降。此前H265 DTS 提取器曾被调整以兼容这种数据但类似问题又在 H265 场景中再次出现。v1.21.2 选择从源头过滤这类独立存在、且作为尾随单元出现的 H264/H265 SEI 数据从而避免问题继续传递到后续处理流程。相关变更涉及 3614、mediacommon 142、6257、mediacommon 382 以及 gortsplib 1184。所有解码器至少返回 1 字节RTSP 相关解码器现在保证至少返回 1 字节数据。该改进来自 gortsplib 1185。补全 RTP/JPEG 实现v1.21.2 完善了 RTP/JPEG 的实现新增对 restart header 的支持。同时JPEG 类型支持范围限定为JPEG 类型 0JPEG 类型 1。该改进来自 gortsplib 1187。RTMP 改进连接异常识别、并发写入与消息处理兼容性提升RTMP 模块本次改进主要面向断开连接识别、写入安全性、发布端消息积压、视频命令帧和空音频消息兼容。服务端写入时也检测读取错误此前系统主要依赖写入错误判断 RTMP 连接是否已经断开。但是在服务端持续写入时连接可能已经发生读取错误而写入操作未必立刻报错。v1.21.2 增加了读取错误检查在服务端写入期间也能够识别断开的 RTMP 连接。该修复对应 6267。rawmessage.Write 改为线程安全rawmessage.Write现在具备线程安全能力避免并发写入场景下的异常行为。该改进来自 gortmplib 136。Writer 主动排空入站消息有些 RTMP 服务端即使客户端处于推流状态也会周期性发送消息。此前如果这些入站消息没有被读取它们会填满内部连接缓冲区最终导致周期性断开连接。v1.21.2 中Writer 也会主动读取并排空入站消息避免这些消息在内部缓冲区不断积压。该改进涉及 5776 和 gortmplib 132。支持 FLV 视频命令帧并跳过空音频消息部分服务端会在第一个视频帧之前发送视频信息或命令帧。这种视频命令帧通常为 2 字节消息包含帧类型 5一个命令字节例如开始 seek 或结束 seek。此前视频消息反序列化会因为长度不足而拒绝该消息进而导致整个连接中止。v1.21.2 对视频消息进行了扩展增加Video.FrameType字段帧类型包括关键帧、互帧和命令帧增加Video.Command字段原有Video.IsKeyFrame被弃用建议使用FrameTypeReader 会跳过命令帧因为命令帧不承载媒体数据。此外部分服务端还会在第一个音频帧之前发送空音频消息。此前空音频消息会因为消息体字节不足而被拒绝并导致连接中止。v1.21.2 对空音频消息的处理方式如下空消息体会被解析为Codec 0的 Audio 消息不设置其他字段再次序列化时仍会恢复为空消息体Reader 会跳过该类消息因为它们不携带媒体数据行为与 FFmpeg 的处理方式一致。该改进来自 gortmplib 128。Video.Type 更名为 Video.PacketType为避免与新增的Video.FrameType字段产生混淆原有的message.Video.Type更名为message.Video.PacketType该改进来自 gortmplib 138。HLS 改进Delta 更新保留 EXT-X-MAPHLS Delta 更新此前生成时没有包含EXT-X-MAP。但对于没有被跳过的标签Delta 更新中必须继续保留这些标签。如果 Delta 更新在跳过分片时缺失EXT-X-MAP部分客户端会在第一次出现这种 Delta 更新时停止播放并出现播放错误。v1.21.2 修复后Delta 更新会保留EXT-X-MAP。该改进来自 gohlslib 397。WebRTC 改进修复特制 WHEP 请求可能引发的崩溃此前某些经过特殊构造的 WHEP 请求可能导致系统发生 panic。触发条件是WHEP 请求中的 SDP 不包含媒体描述。v1.21.2 修复了这一问题避免无媒体描述的 SDP 请求导致程序异常崩溃。该修复涉及 6301 与 6309。依赖更新v1.21.2 同步升级了多项依赖库。Go从 1.26 升级到 1.27code.cloudfoundry.org/bytefmt从 v0.90.0 升级到 v0.92.0github.com/bluenviron/gohlslib/v2从 v2.4.5 升级到 v2.4.6github.com/bluenviron/gortmplib从 v1.0.3 升级到 v1.0.4github.com/bluenviron/gortsplib/v5从 v5.6.6 升级到 v5.6.7github.com/bluenviron/mediacommon/v2从 v2.9.5 升级到 v2.9.6github.com/datarhei/gosrt从 v0.11.1-0.20260812091715-a77b40bb4b76 升级到 v0.12.0github.com/gin-contrib/pprof从 v1.5.5 升级到 v1.5.6github.com/go-git/go-billy/v5从 v5.9.1 升级到 v5.9.2github.com/go-git/go-git/v5从 v5.19.2 升级到 v5.19.3github.com/pion/ice/v4从 v4.4.2 升级到 v4.4.5github.com/pion/interceptor从 v0.1.48 升级到 v0.1.49github.com/pion/rtcp从 v1.2.17 升级到 v1.2.19github.com/pion/transport/v4已移除github.com/pion/webrtc/v4从 v4.2.20 升级到 v4.2.22github.com/quic-go/quic-go从 v0.62.0 升级到 v0.63.0github.com/pion/datachannel从 v1.6.2 升级到 v1.6.3github.com/pion/dtls/v3从 v3.1.8 升级到 v3.1.9github.com/pion/mdns/v2从 v2.2.0 升级到 v2.2.2github.com/pion/sctp从 v1.11.1 升级到 v1.11.3github.com/pion/srtp/v3从 v3.0.15 升级到 v3.1.3github.com/pion/stun/v4从 v4.0.0 升级到 v4.0.1github.com/pion/turn/v5从 v5.1.0 升级到 v5.1.2github.com/pjbgf/sha1cd从 v0.6.0 升级到 v0.7.0github.com/pion/transport/v5新增 v5.1.1安全说明发布流程与二进制校验mediamtx 的二进制文件由 Release 工作流从源代码编译生成。该流程完全公开可见用于防止构建产物在生成过程中被修改或受到外部干扰。二进制文件的校验和也会通过 GitHub Attestations 发布到公开区块链中可通过以下命令验证lsmediamtx_*|xargs-L1gh attestation verify--repobluenviron/mediamtx还可以下载checksums.sha256文件并通过以下命令验证二进制文件校验和catchecksums.sha256|grep$(lsmediamtx_*)|sha256sum--check总结mediamtx v1.21.2 重点解决了 UDP 关闭期间的数据包丢失、匿名请求触发 JWKS 获取、旧版凭据下播放服务访问控制、空 UDP 数据报造成的内存问题、API 重载死锁、RTSP 静态源 UDP 缓冲区首次连接不生效、RTMP 消息积压与兼容性问题、HLS Delta 更新缺失EXT-X-MAP、WHEP 特制请求触发异常等问题。同时该版本完成了多项底层依赖升级并继续提供可验证的发布构建与校验机制。