简体中文
Mesio 引擎
Mesio 是 rust-srec 的进程内 Rust 下载引擎。与 FFMPEG 和 Streamlink 不同,它并非外部程序,而是运行在录制器内部——这也是它在三种引擎中 CPU 与内存占用最低、并支持 HLS 与 MPEG-DASH 多线程下载的原因。本页介绍 Mesio 的内部工作原理;若需三种引擎的功能横向对比,请参阅引擎。
架构
单一的 MesioDownloader 负责选择协议(HLS、MPEG-DASH 或 FLV)与来源,随后无论何种协议都产出一个统一的下载会话(download session)。该会话暴露两条流——保证交付的 items(媒体数据与终止标记)流,以及尽力而为的 events(进度/遥测)流——外加一个用于取消和可选指标的控制句柄。
HLS 反应堆引擎
对于 HLS,全部下载状态都集中在一处——调度反应堆(Scheduler Reactor)。它掌管:
- 分段身份与去重:播放列表刷新轮换鉴权令牌时分段不会被重复抓取(例如 Twitch 签名链接,可剥离轮换的查询参数,使同一分段在多次刷新间被识别)。
- 重试预算:包括将下载途中过期的签名链接透明切换到较新的链接重试。
- 有上限的并发抓取任务:其进行中的下载、解密处理与输出缓冲各自受明确的内存预算约束——因此高速流或加密流不会再让内存无限增长。
解密在独立的加密处理池中运行,位于调度循环之外,因此大量加密分段同时到达时,解密也不会阻塞调度。随后 SequenceAssembler 保证输出有序、fMP4 初始化分段先于依赖它的媒体写入(避免编解码不匹配导致的损坏),并在分段掉出直播窗口时以明确的缺口取代无声卡死。
限流
当服务器以 HTTP 429(Too Many Requests),或带 Retry-After 头的 503 回应 HLS 或 DASH 请求时,Mesio 会暂停发往该服务器的所有请求:按 Retry-After 要求的时长暂停,最短四分之一秒,最长一分钟;没有该头时则从约一秒开始退避,服务器持续拒绝时每次翻倍,最长 30 秒。请求经过重定向时,请求发往的服务器和作出拒绝的服务器都会暂停。暂停结束后先发出一个请求,待其得到回应后其余请求再跟上,避免服务器一次收到全部积压的请求。
这类回应不计入分段或播放列表/清单的重试次数。一个分段自首次被暂停起满五分钟后才会放弃;直播分段若在暂停期间离开播放列表窗口,则作为缺口跳过。若带签名的分段地址在暂停结束后被以未授权拒绝,Mesio 会最多等待 10 秒,等下一次播放列表或清单带来新的地址,然后才放弃该分段。当播放列表或清单因限流连续五分钟未能获取时,录制失败;若在 最大停顿时间 内没有任何媒体到达(例如 HLS 播放列表被拒绝期间),录制会更早失败。
MPEG-DASH 引擎
Mesio 可以录制 MPEG-DASH(.mpd)流,包括直播和已结束的点播内容。平台标记为 DASH 的流,以及以 .mpd 结尾的地址,都会使用此引擎。
- MPD 监视器负责加载清单;对于直播,它刷新清单的频率不会高于配置的最小间隔或清单自身的更新周期。它会校正本地时钟与服务器时钟之间的偏差,避免在直播分段生成之前就去请求。如果已结束的节目将每个版本存为一个带索引的文件(
SegmentBase),监视器会在录制开始前读取所录版本的索引,以便按片段下载。 - 按配置的质量和音频语言选择一个视频轨道和一个音频轨道。每个轨道都由与 HLS 相同的反应堆和组装器下载,并拥有各自的内存预算,因此一个轨道变慢不会拖住另一个。
- 合流器将分开传输的视频和音频合并为一个分片 MP4 文件。之后的修复、分段与写入与 HLS fMP4 录制相同;修复 DASH 流(
fix_dash)控制是否进行修复。
当节目进入新的 Period(例如插入广告前后),或所选的视频、音频版本发生变化时,录制会开始新文件。已结束的节目从第一个分段开始录制,最后一个分段写入后录制随即结束。直播录制按直播录制起点设置从直播边缘之后开始。
限制:
- 拒绝录制 DRM 加密的流和 WebM 媒体。支持使用
SegmentTemplate或SegmentList的清单,也支持使用SegmentBase的已结束节目;使用SegmentBase的直播清单会被拒绝。 - 不录制字幕及其他文本轨道。
- 轨道从开始录制时所在的 Period 中选择:只在之后的 Period 中出现的轨道类型不会被加入。
- 网页播放器无法播放 DASH 流,会提示该格式不受支持。录制得到的文件是普通的 MP4 文件。
DASH 设置列在 MPEG-DASH 录制中。
下载会话
Mesio 的 HLS、DASH 与 FLV 下载器共用这同一套会话模型,因此进度上报、重试处理与取消行为在各协议间表现一致。items 流是权威的——它承载录制器所依赖的媒体与终止标记——而 events 流则是尽力而为的遥测,用于在界面中呈现进度与统计;handle 则负责取消与可选的性能指标。
媒体修复流水线
下载会话与媒体修复是两个独立层次。启用流处理和对应的 Mesio 修复开关时,下载数据会先经过修复再交给写入器;否则会直接进入写入器。
- FLV 修复会补全缺失的容器结构、修正时间戳不连续、按配置过滤重复数据,并在流头不兼容时开始写入新文件,同时维护快速定位所需的元数据。处理缓冲区有明确上限,因此损坏或异常的流不会导致内存无限增长。
- HLS 与 DASH 修复会保证分片 MP4 初始化数据的写入顺序,检查已交付的 TS 与 fMP4 分段是否出现不兼容的格式变化,必要时开始写入新文件,并执行文件大小或时长限制。内存限制按数据量计算,而不只依赖排队分段的数量。
HLS 下载反应堆会按配置的缺口策略报告或跳过无法获取的媒体。修复流水线只会接收已交付的媒体以及明确的分割或终止标记;它无法重建源站从未交付的字节,也不会对媒体载荷进行转码。
如果分片全部失败、下载没有交付任何媒体,下载会以该失败(例如 HTTP 状态码或网络错误)结束,而不是当作一次空录制。一旦确认媒体依赖的 fMP4 初始化分片已失败,这些媒体无法解码,便不再下载;直播流如果将从这样的媒体开始,会立即结束。MPEG-TS 媒体不依赖初始化分片即可解码,仍会照常下载。
Mesio 独占功能
Mesio 专属的处理选项记录在引擎页面:
- FLV 一致性修复 —— 修复 FLV 结构与时间戳,并在不移动文件后续内容的前提下完成 AMF 元数据。
- 原始数据模式 —— 不做包解析,直接把流字节写入磁盘,以降低 CPU 和内存开销。
- HLS 一致性修复 —— 在写入前保护分段结构,并在不连续或有意义的流变化处轮换输出。
- MPEG-DASH 录制 —— 录制 DASH 流,并将分开传输的视频和音频合并为一个文件。
NOTE
完整的引擎设计与源码放在一起,见 crates/mesio/docs/HLS_ENGINE_ARCHITECTURE.md 与 crates/mesio/docs/DOWNLOADER_ENGINE_ARCHITECTURE_PLAN.md。