mediamtx v1.21.1发布:浏览器请求安全加固、HLS 会话重构、WebRTC 播放修复与全链路媒体兼容性升级



2026 年 9 月 24 日,mediamtx 发布 v1.21.1 最新版本。本次更新重点覆盖通用安全、配置认证、H265 与 MP4 媒体处理、RTSP、RTMP、HLS、WebRTC,以及大量依赖组件升级。
从更新内容来看,v1.21.1 并非单一功能版本,而是一次围绕“安全性、协议兼容性、长时间流稳定性、浏览器播放体验、会话管理效率”展开的集中修复版本。尤其是浏览器 POST 请求来源校验、HLS 会话生命周期重构、DJI 无人机流兼容性修复、AV1 浏览器播放卡住处理等内容,对生产环境中的流媒体服务稳定性具有直接意义。
一、通用功能与安全:浏览器 POST 请求必须校验允许来源
本次版本首先对浏览器发起的 POST 请求进行了安全强化。
此前,浏览器可以在不执行预检请求的情况下发送 POST 请求,同时浏览器也不会主动确认请求来源是否位于 Access-Control-Allow-Origin 允许范围内。这样的行为可能导致服务端仅依赖浏览器侧跨域机制,而没有对请求来源执行足够的服务端校验。
v1.21.1 针对这一情况进行了处理:服务端会拦截来自浏览器的 POST 请求,并检查请求的来源是否被允许。如果请求来源不在允许列表内,服务端将直接阻止该请求。
这项改动对应事项 6238。它让来源控制不再仅依赖浏览器的预检流程,而是通过服务端主动校验补足安全边界。对于存在浏览器控制接口、网页播放器控制接口或浏览器侧 API 调用的部署场景,这项改动尤为重要。
二、配置与认证:修复默认内部认证用户的比较和共享问题
v1.21.1 修复了配置系统中默认 authInternalUsers 的比较与共享问题,对应事项 6205。
authInternalUsers 用于内部认证用户相关配置。默认配置对象在比较或共享时如果处理不正确,可能导致配置判断结果异常,或者使多个配置使用场景之间出现不符合预期的共享行为。
此次修复聚焦默认认证用户配置的比较逻辑与共享逻辑,使默认值在处理过程中更加正确、稳定。
三、H265 与媒体基础能力:修复长期参考帧 DTS 提取
在 H265 流处理方面,v1.21.1 修复了包含长期参考图片流的 DTS 提取问题。
H265 视频流中可能包含长期参考图片。对于这类流,如果 DTS 提取逻辑不正确,就可能影响时间戳处理和后续封装、转发或播放流程。
本次修复来自媒体公共组件更新,对应事项 371。修复后,包含长期参考图片的 H265 流可以得到正确的 DTS 提取结果。
四、MP4 与分段 MP4:提升封装、解析与长时间媒体轨道兼容性
v1.21.1 对普通 MP4 与分段 MP4 的支持进行了多项重要修复,覆盖样本大小、H265 SPS 校验、缺少编辑列表、读取定位错误、时序字段和超长轨道等场景。
1. 支持固定样本大小的 stsz
本次更新支持 stsz 中使用固定样本大小的媒体文件,对应事项 5803 和媒体组件事项 373。
stsz 是 MP4 中与样本大小相关的结构。当媒体轨道使用固定样本大小时,解析逻辑需要正确识别这一模式。此前如果相关支持不足,可能导致特定 MP4 文件无法被正常处理。
v1.21.1 增加这一兼容能力后,可正确支持使用固定样本大小的 stsz 结构。
2. 恢复入站 H265 SPS 检查
普通 MP4 与分段 MP4 均恢复了对入站 H265 SPS 的检查,对应媒体组件事项 374。
有效的 H265 SPS 是重新封装 MP4 所必需的数据。如果没有有效 SPS,就无法正确生成或回写 MP4。因此,本次版本恢复了对入站 H265 SPS 的校验。
这一调整意味着:当输入 H265 流中的 SPS 无效时,系统会重新执行必要检查,而不是继续进入可能无法正确封装 MP4 的流程。
3. 支持没有 edts 的轨道
v1.21.1 支持没有 edts 的 MP4 轨道,对应媒体组件事项 375。
根据 ISO/IEC 14496-12 的 8.6.5 节,编辑框是可选的。此前,没有 edts 的轨道可能会被拒绝,并返回类似“unexpected box ‘mdia’”的错误。
本次修复后,缺少 edts 的媒体轨道不会再因为这一可选结构不存在而被错误拒绝。
4. 正确返回 GetPayload 的 seek 错误
本次更新修复了 GetPayload 在定位读取时未正确返回 seek 错误的问题,对应媒体组件事项 376。
此前,GetPayload 在执行 seek 后检查了错误的变量。因此,当 seek 失败时,错误可能被忽略,读取操作会从读取器的当前位置继续执行。
这种情况可能造成读取位置错误,进而导致载荷读取结果不正确。v1.21.1 修复后,seek 失败会被正确识别并返回,避免从错误位置读取媒体载荷。
5. 正确填充 HvcC 的 NumTemporalLayers 与 TemporalIdNested
普通 MP4 与分段 MP4 均修复了 HvcC 参数填充问题,对应媒体组件事项 379。
本次修复会根据 H265 SPS 正确填充以下字段:
NumTemporalLayersTemporalIdNested
这两个字段与 H265 视频的时间层信息相关。此前如果未根据 SPS 正确填写,可能导致生成的 HvcC 配置信息不完整或不准确。
6. 支持超过 2 的 32 次方时间刻度的轨道
v1.21.1 支持时长超过 2 的 32 次方 ticks 的媒体轨道,对应媒体组件事项 377。
对于超长时间运行的流、长时长录像或时间刻度累计较大的 MP4 轨道,时间值可能超过传统 32 位范围。此前这样的轨道可能无法被正确处理。
本次更新提升了 MP4 对超长轨道的兼容能力。
五、RTSP:MJPEG、MPEG-4 Audio LATM 与 SDP 解析修复
RTSP 相关改动覆盖 MJPEG、MPEG-4 Audio LATM 和 SDP 三部分。
1. 拒绝保留的 MJPEG 量化值 127
本次版本修复 RTP MJPEG 对量化值的校验逻辑,对应 RTSP 组件事项 1161。
RFC 2435 中规定,量化值 100 到 127 为保留值。此前的判断条件使用了 Quantization < 127,导致量化值 127 没有被正确拒绝。
v1.21.1 修复后,会拒绝保留量化值 127,从而使校验行为符合保留值范围要求。
2. MPEG-4 Audio LATM 复用配置层不再触发异常退出
本次更新修复了 MPEG-4 Audio LATM 在某个层复用配置时可能发生异常退出的问题,对应 RTSP 组件事项 1162。
当某个 LATM 层复用已有配置时,处理逻辑需要正确识别并使用已有配置。此前这一场景可能导致程序发生异常退出。
修复后,复用配置的层可以被正确处理,不再因该情况触发异常。
3. SDP 支持 origin 中的超大数值
v1.21.1 提升了 SDP 的兼容性,支持 origin 字段中的超大数字,对应事项 5949 与 RTSP 组件事项 1171。
SDP 的 origin 信息中可能出现超出普通数值处理范围的大型数字。此前,如果解析逻辑无法处理这类数值,就可能导致 SDP 解析失败。
本次修复后,SDP origin 中的超大数值能够被支持。
六、RTMP:H265 配置字段修复与 DJI 独立 SEI 支持
RTMP 部分同样包含两项针对视频流兼容性的改动。
1. 根据 SPS 正确填充 HvcC 时间层字段
RTMP 处理逻辑中,也修复了 HvcC 的 NumTemporalLayers 和 TemporalIdNested 填充问题,对应 RTMP 组件事项 129。
修复方式与 MP4、分段 MP4 部分一致:从 H265 SPS 中提取相关信息,并据此正确填写 HvcC 字段。
2. 支持来自 DJI 无人机的独立 SEI
v1.21.1 的 RTMP reader 支持来自 DJI 无人机流中的独立 SEI,对应事项 5221 和 RTMP 组件事项 130。
部分 DJI 无人机输出的视频流会包含独立存在的 SEI 单元。此前,如果读取逻辑无法正确处理这些独立 SEI,可能影响流的后续解析或播放。
本次更新增加对这一类独立 SEI 的支持。
七、HLS:会话由服务器统一管理,关闭后的返回语义更准确
HLS 是本次版本改动较集中的模块之一,核心方向是会话管理重构与关闭状态下的响应优化。
1. HLS 会话改由服务器管理
v1.21.1 让 HLS 服务器负责管理会话,对应事项 6239。
此前,HLS 会话的生命周期与 muxer 存在关联。此次调整后,会话生命周期从 muxer 中分离出来,由 HLS 服务器统一管理。
这一改动带来性能提升。原因在于:查找会话时,现在只需要遍历单个互斥锁,而不再需要像此前一样经过两个通道。
因此,本次 HLS 会话重构包含两层变化:
- 会话生命周期不再绑定 muxer;
- 会话查找路径更简化,只需经过单个互斥锁。
2. muxer 已关闭但会话仍有效时返回 404
本次版本修复了一个 HLS 会话与 muxer 关闭后的状态判定问题,对应事项 5736 和 6240。
HLS muxer 关闭后,相关 HLS 会话会保留最多 30 秒。在这段时间内,服务器仍可处理属于这些会话的入站请求。
这一机制的目的,是让服务器能够将此类请求正确分类为 404,而不是错误地归类为 401。
也就是说,当会话仍然有效,但对应 muxer 已关闭时,服务端将返回 404。
3. 会话不存在时调整错误信息
v1.21.1 还修改了 HLS 会话未找到时返回的错误信息,对应事项 6241。
新的行为与 RTSP 保持一致:当会话不存在时,返回“session not found”一类的会话未找到信息,而不是返回“authentication error”。
认证错误应仅用于创建会话时的认证失败,而不应被用于已经进入会话使用阶段、但目标会话不存在的情况。
这一改动让 HLS 的错误语义更加准确:
- 创建会话失败时,认证错误仍用于认证场景;
- 使用会话时找不到会话,则返回会话未找到信息。
4. muxer 关闭时返回 404
HLS muxer 本身也调整为在关闭状态下返回 404,对应 HLS 组件事项 394。
这一调整与前述会话保留、关闭后请求分类逻辑相互配合,使关闭状态下的 HTTP 响应更加清晰。
八、WebRTC:解决 AV1 卡住问题,修复 DJI 无人机视频解码停滞
WebRTC 部分包含两个直接影响浏览器播放体验的修复,以及一个网络接口配置能力补充。
1. 通过移除填充数据修复 AV1 播放卡住
v1.21.1 修复了 AV1 视频在浏览器中可能卡住的问题,对应事项 5632、5774 和 6242。
多个编码器会生成 AV1 OBU padding,也就是 OBU 填充数据。实际验证表明,移除这些填充数据能够解决大多数浏览器播放此类流时卡住的情况。
因此,本次更新会剥离 AV1 OBU padding,以改善浏览器播放稳定性。
该修复主要针对浏览器播放场景,解决部分 AV1 流在播放过程中停滞的问题。
2. 过滤特定 DJI SEI,修复浏览器解码卡住
v1.21.1 修复了 DJI 无人机流在浏览器中出现视频解码卡住的问题,对应事项 5221、6051 和 6243。
DJI 无人机视频流中包含某些 SEI 单元,这些单元具有以下特征:
- SEI payload type 为 5;
- 包含特定 UUID。
这些 SEI 单元似乎会导致 Chrome 和 Firefox 中的视频播放停滞。为处理这一问题,本次版本会过滤掉这些特定 SEI 单元。
需要注意的是,这与 RTMP 部分支持独立 SEI 的更新并不矛盾:RTMP reader 增加了对 DJI 独立 SEI 的支持,而 WebRTC 则针对会导致浏览器解码停滞的特定 SEI 内容进行过滤。
3. 支持排除网络接口
WebRTC 新增了排除网络接口的能力,对应事项 5788。
通过这一能力,可以在 WebRTC 网络接口选择过程中排除指定接口。
九、依赖组件升级:媒体、网络、加密、WebRTC 与数据处理组件全面更新
v1.21.1 同步更新了多项依赖,涉及字节格式化、密钥处理、MP4、HLS、RTMP、RTSP、媒体处理、性能分析、加密、ICE、SDP、传输、WebRTC、数据库、文本处理、协议缓冲等模块。
以下为本次更新的完整依赖变更。
code.cloudfoundry.org/bytefmt从v0.88.0更新至v0.90.0github.com/MicahParks/keyfunc/v3从v3.8.1更新至v3.8.2github.com/abema/go-mp4从v1.7.1更新至v1.7.3github.com/bluenviron/gohlslib/v2从v2.4.4更新至v2.4.5github.com/bluenviron/gortmplib从v1.0.2更新至v1.0.3github.com/bluenviron/gortsplib/v5从v5.6.5更新至v5.6.6github.com/bluenviron/mediacommon/v2从v2.9.4更新至v2.9.5github.com/gin-contrib/pprof从v1.5.4更新至v1.5.5github.com/matthewhartstonge/argon2从v1.5.7更新至v1.6.3github.com/pion/ice/v4从v4.4.1更新至v4.4.2github.com/pion/interceptor从v0.1.47更新至v0.1.48github.com/pion/sdp/v3从v3.0.19更新至v3.0.20github.com/pion/transport/v4从v4.1.0更新至v4.1.1github.com/pion/webrtc/v4从v4.2.19更新至v4.2.20golang.org/x/crypto从v0.55.0更新至v0.57.0golang.org/x/net从v0.58.0更新至v0.59.0golang.org/x/sync从v0.22.0更新至v0.23.0golang.org/x/sys从v0.47.0更新至v0.48.0golang.org/x/term从v0.45.0更新至v0.46.0github.com/bytedance/gopkg从v0.1.3更新至v0.1.4github.com/bytedance/sonic从v1.15.0更新至v1.15.2github.com/bytedance/sonic/loader从v0.5.0更新至v0.5.1github.com/cloudwego/base64x从v0.1.6更新至v0.1.7github.com/gabriel-vasile/mimetype从v1.4.12更新至v1.4.13github.com/gin-contrib/sse从v1.1.0更新至v1.1.1github.com/go-playground/validator/v10从v10.30.1更新至v10.30.3github.com/goccy/go-json从v0.10.5更新至v0.10.6github.com/klauspost/cpuid/v2从v2.3.0更新至v2.4.0github.com/mattn/go-isatty从v0.0.20更新至v0.0.23github.com/pelletier/go-toml/v2从v2.2.4更新至v2.4.3github.com/pion/dtls/v3从v3.1.5更新至v3.1.8github.com/pion/mdns/v2从v2.1.0更新至v2.2.0github.com/pion/srtp/v3从v3.0.13更新至v3.0.15github.com/pion/stun/v3已移除github.com/pion/turn/v5从v5.0.13更新至v5.1.0go.mongodb.org/mongo-driver/v2从v2.5.0更新至v2.8.0golang.org/x/arch从v0.22.0更新至v0.29.0golang.org/x/text从v0.41.0更新至v0.42.0google.golang.org/protobuf从v1.36.10更新至v1.36.11- 新增
github.com/pion/stun/v4,版本为v4.0.0 hls.js从v1.7.2更新至v1.7.3
十、发布安全:从源码构建、公开流程与二进制校验能力
v1.21.1 的二进制文件由 Release 工作流从源代码编译生成。
该发布流程完全公开,可以防止发布产物在构建过程中被修改,或受到外部干扰。
同时,二进制文件的校验和会通过 GitHub Attestations 发布到公共区块链中,并可使用以下命令验证:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
还可以下载 checksums.sha256 文件,并执行以下命令验证二进制校验和:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
十一、版本总结
代码地址:github.com/bluenviron/mediamtx
mediamtx v1.21.1 的更新重点可以归纳为以下几个方面:
- 浏览器 POST 请求增加允许来源服务端校验;
- 修复默认内部认证用户配置的比较和共享;
- 改进 H265 长期参考图片流的 DTS 提取;
- 强化 MP4、分段 MP4 对样本大小、SPS、编辑列表、长轨道和 HvcC 参数的兼容能力;
- 修复 RTSP 中 MJPEG、MPEG-4 Audio LATM、SDP 的边界问题;
- 改进 RTMP 对 H265 配置及 DJI 无人机独立 SEI 的处理;
- 重构 HLS 会话管理机制,并优化 muxer 关闭后的 404 响应行为;
- 修复 WebRTC 中 AV1 OBU padding 导致的浏览器播放卡住问题;
- 过滤可能导致浏览器解码停滞的 DJI 特定 SEI;
- 增加 WebRTC 排除网络接口的能力;
- 升级媒体处理、网络传输、WebRTC、加密、数据库及多个基础依赖;
- 提供发布构建来源与二进制校验验证方式。
对于使用 HLS、WebRTC、RTMP、RTSP、MP4 录像或 H265 视频流的场景,mediamtx v1.21.1 将重点改善安全校验、协议兼容、长时间流处理和浏览器播放稳定性。
火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。
更多推荐
所有评论(0)