跳转到正文

录制引擎 ​

首次录制可使用 Mesio。需要 FFmpeg 的容器或编码兼容性时选择 FFmpeg,需要 Streamlink 的下载行为时选择 Streamlink。FFmpeg 和 Streamlink 需安装在后端主机;Docker 镜像包含受支持的工具。

Streamlink 也可作为提取器,在下载前解析直播 URL。提取器和下载引擎可独立选择,详见引擎与提取器设置。

1. 引擎功能列表 ​

功能MesioFFMPEGSTREAMLINK
FLV 下载✅✅❌
HLS 下载✅
(多线程)
✅✅
(多线程)
MPEG-DASH 下载✅
(多线程;独立的视频和音频合并为一个文件)
取决于所安装的 FFmpeg取决于所安装的 Streamlink
录制时长统计✅
(不支持原始数据模式)
✅✅
下载码率统计✅✅
(不支持 -f segmentation)
✅
(不支持 -f segmentation)
按大小分段✅
(不支持原始数据模式)
✅
(不支持 -f segmentation)
✅
按时长分段✅
(不支持原始数据模式)
✅✅
下载格式FLV, M3U8, MPD, TS, M4S支持其他格式支持其他格式
FLV 一致性修复✅ (推荐)❌❌
HLS 一致性修复✅ (推荐)❌❌
DASH 一致性修复✅ (推荐)❌❌
CPU 使用率最低低低
内存使用率最低低中

使用 Mesio 时,可按需启用 FLV、HLS 和 DASH 一致性修复,以使用修复和分段功能。它们不能恢复源站从未交付的媒体。

Mesio 引擎的设置分为 FLV、HLS 和 DASH 三个选项卡,每个选项卡先显示该协议的一致性修复开关和大多数录制需要的设置。FFmpeg 和 Streamlink 的设置以 启用无损分段 开头。各引擎较少用的设置都归入 高级。每个分组以及 Mesio 的每个选项卡会显示其中有多少项设置与默认值不同(在模板覆盖中则显示模板设置了多少项),恢复默认值(模板中为 使用引擎设置)可清除单个分组的这些设置。

留空的字段使用其中显示的默认值;保存引擎时只会保存你设置过的项,因此引擎会跟随今后默认值的变化。在模板的引擎覆盖中,每项设置都可以使用引擎设置(不写该字段)、默认值(null)或自定义值。

2. FLV 一致性修复 ​

启用后,FLV 数据会在进入写入器前通过一条有序修复链。该链保留媒体载荷,主要修复容器层结构:

问题流水线行为
缺少 FLV 文件头在首个标签前插入有效文件头
视频或音频格式变化开始写入新文件,并补充播放所需的文件头
视频数据乱序在保持内存有界的前提下重排相邻标签
时间戳跳变或回退调整时间戳以保持播放连续性
重复媒体标签或序列头启用对应选项时过滤
达到文件大小或时长限制视频在关键帧边界轮换,仅音频输出则在下一个标签轮换
FLV 统计与快速定位索引在文件关闭前更新元数据

元数据更新不会重写已经完成的媒体数据。如果可用元数据空间不足,会缩短可选的快速定位索引。带过滤或加密标记的脚本载荷保持不变。

循环保护 ​

源站卡顿时,部分 CDN 会重放直播流最后几秒的内容,导致录像中出现重复画面。循环保护(Loop Protection)(flv_fix.duplicate_tag_filtering)用于删除这类重复内容,默认关闭。

启用后,Mesio 会保留近期音视频数据包的副本。只有新数据包与其中某个包完全一致(字节内容、轨道和时间戳均相同)时才会被丢弃;相似或疑似重复的数据包一律保留。

源站重连或结束推流、音频或视频配置变化以及出现明确的流不连续标记时,Mesio 会清空这份历史。遇到无法比对的音视频数据包(例如加密包、多轨包或命令包)时也会清空,因此循环保护对多轨或加密流作用有限。源站重复发送未变化的配置(例如在每组画面前重发)不会清空历史。

完全匹配也有代价:如果编码器重启后没有发送不同的流头信息,并在相同时间戳上产生完全相同的帧(例如静音或黑屏),这些帧也会被删除。

偏移一致性检查(Offset Consistency Check)(flv_fix.duplicate_tag_filter_config.enable_replay_offset_matching)还能识别时间戳经过平移的重放,这是完全匹配无法做到的。该选项默认关闭,且仅在循环保护启用时生效。时间戳大幅回退后,Mesio 会短暂暂存随后的数据包并与历史比对;只有至少三个不同的数据包按原顺序匹配、且时间戳平移量一致时,才会删除这段重放。否则暂存的数据包会原样写入,并重新开始记录历史。

这两个选项都属于启发式判断。如需保留源站发送的全部数据包,请保持循环保护关闭。

启用循环保护时,每个录制的内存占用如下:

  • 历史最多保留 8,192 个数据包或 16 MiB,以先达到者为准。超过字节上限的数据包会原样写入,但会清空历史。
  • 偏移一致性检查在核对疑似重放时,最多额外暂存 1 MiB。
  • 循环保护关闭时不分配任何内存。

字节上限由 flv_fix.duplicate_tag_filter_config.window_capacity_bytes 控制(默认 16777216;0 表示不保留历史),位于 FLV 选项卡的 高级 → 循环保护 中。

3. 原始数据模式 (Raw Data Mode) ​

在原始数据模式下,Mesio 引擎会将从网络接收到的流数据直接写入磁盘,不解析或处理媒体包(头信息、帧、元数据)。

主要特点: ​

  • 减少处理开销:跳过包解析和重封装可降低 CPU 和内存占用。
  • 适用场景:高带宽流或资源受限的环境(如入门级 NAS 或 VPS)。仅在网络稳定且 CDN 或流来源不会变更媒体头部等流结构时使用。

局限性: ​

由于不检查包结构,启用原始数据模式时,以下高级功能将无法使用:

  • 数据统计:无法实时计算录制时长和下载码率统计。
  • 自动分段:引擎无法检测帧边沿或时长,因此无法按大小或时长进行精确分段。
  • 修复功能:无法应用 FLV、HLS 或 DASH 一致性修复,因为这些功能需要包级别的操作。

4. HLS 一致性修复 (Mesio 独占) ​

Mesio 的 HLS 下载反应堆与 HLS 修复流水线职责不同:

  • 下载引擎负责对已抓取分段排序,先写入 fMP4 媒体所需的初始化数据,应用已配置的缺口策略,并保留播放列表不连续所形成的输出边界。
  • 一致性修复会在已交付分段出现不兼容的编解码器、分辨率、节目布局或 fMP4 初始化数据变化时开始写入新文件,并执行文件大小与时长限制。

该流水线不会改写 TS 或 fMP4 载荷内的时间戳,不能重建缺失媒体,也不会转码。被跳过的分段仍然是可观测的缺口;流水线会保持已交付输出的顺序,并在检测到需要新文件的格式变化时轮换输出。

5. MPEG-DASH 录制 (Mesio 独占) ​

Mesio 可以录制 MPEG-DASH(.mpd)流,包括直播和已结束的流。DASH 通常分开传输视频和音频,Mesio 会将它们合并为一个分片 MP4 文件。不支持 DRM 加密的流、WebM 媒体和使用 SegmentBase 的直播清单,也不会录制字幕。详见 DASH 引擎的工作方式。

修复 DASH 流(fix_dash,默认开启)会对合并后的输出应用与 HLS 相同的一致性修复:在出现不兼容的流变化时开始新文件,并执行文件大小与时长限制。

其他设置位于 Mesio 引擎的 DASH 选项卡中,保存在引擎配置的 dash 对象里。留空的字段使用下表中的默认值。

设置JSON 字段默认值说明
视频质量dash.video_quality{"type": "highest"}录制哪个视频版本:带宽最高(highest)或最低(lowest);{"type": "max_height", "height": 720} 表示不超过该高度的最佳版本(没有符合的版本时使用最小画面);{"type": "closest_bandwidth", "bandwidth": 2500000} 表示最接近该带宽(bit/s)的版本。
音频质量dash.audio_quality{"type": "highest"}在选定语言中录制哪个音频版本:highest、lowest 或 closest_bandwidth。
首选音频语言dash.audio_language无语言标签,例如 en 或 pt-BR。没有匹配的语言时使用任意语言。
录制视频dash.include_videotrue录制视频轨道。
录制独立音频dash.include_audiotrue录制单独传输的音频。视频流内自带的音频始终保留。视频和音频不能同时关闭。
直播录制起点dash.live_start{"type": "auto"}直播从哪里开始录制:auto 采用流建议的延迟,否则落后直播边缘三个分段;live_edge 从最新分段开始;{"type": "delay", "delay_ms": 6000} 从落后直播边缘该时长处开始。已结束的流始终从头录制。
下载并发数dash.download_concurrency5每个轨道同时下载的分段数。
分段超时(毫秒)dash.segment_timeout_ms10000单个分段下载的时限。
分段重试次数dash.max_segment_retries3分段下载失败后的重试次数。因限流被拒绝的请求不计入。
清单超时 (ms)dash.manifest_timeout_ms15000单次清单请求,或单次读取流索引的时限(参见 DASH 引擎的工作方式中的 SegmentBase)。
最小刷新间隔 (ms)dash.min_refresh_interval_ms1000两次直播清单刷新之间的最短间隔;清单自身的更新周期更长时以其为准。
刷新重试次数dash.max_refresh_retries5清单连续刷新失败多少次后录制失败。读取流索引失败时也按此次数重试。因限流被拒绝的请求不计入。

数量和时限必须为正数,重试次数和直播起点延迟可以为 0。引擎无法使用的设置会使录制以配置错误失败。在模板的引擎覆盖中,每项 DASH 设置都可以使用引擎设置(不写该字段)、默认值(null)或自定义值;保存为 "dash": null 的覆盖会将所有 DASH 设置恢复为默认值。如果模板与引擎设置合并后既不录制视频也不录制音频,模板将无法保存。

若平台提供多种格式时希望优先使用 DASH,请在主播或模板的首选格式中添加 dash。部分平台(例如 TikTok)的 DASH 流仅在明确选择时使用:只有 dash 是第一个首选格式时才会选用,不受画质和 CDN 偏好影响。

无损分段 ​

在支持的录制过程中,打开主播卡片的操作菜单,选择立即分割文件。该操作只会出现在支持无损分段的录制中。分割进行时,卡片会先显示正在分割…,再显示正在收尾…。录制器会结束当前文件,并在同一录制会话中继续写入新文件。分段不会重新编码媒体,也不会因此重新连接直播源。

操作会等待安全的媒体分割点。重复点击会合并为同一个待处理请求。如果 30 秒内未出现合适的分割点,请求会过期,录制仍会继续。提示会说明原因:没有收到新的媒体数据、没有收到关键帧(FLV)、直播流的 HLS 分片未标记为可独立播放,或之前的文件仍在收尾(FFmpeg 和 Streamlink)。文件收尾可能需要更长时间;只有旧文件已完成且新文件已开始后,才会提示成功。

引擎可用条件
Mesio FLV需要启用 FLV 一致性处理,并具备新文件所需的头信息。视频分段等待关键帧。
Mesio HLS需要启用 HLS 一致性处理,并等待可独立解码的 TS 或 fMP4 分段。
Mesio DASH需要启用 DASH 一致性处理,并等待可独立解码的分段。
FFmpeg需要打开实验性的启用无损分段选项,输出为 MP4、MKV、FLV、TS 或 MOV,且没有自定义输出参数。
Streamlink需要打开实验性的启用无损分段选项,支持相同的输出格式,且没有额外的 Streamlink 参数。

在所用的 FFmpeg 或 Streamlink 下载引擎配置中,打开启用无损分段。该选项带有实验性标记,默认关闭,已有配置也保持关闭。对应的 JSON 字段为 enable_lossless_cutting(默认 false),修改仅对新开始的录制生效。模板的引擎覆盖设置可以开启或关闭,可以选择默认使用默认值(关闭),也可以选择使用引擎设置来继承引擎配置。Mesio 不需要此选项。

为支持的 FFmpeg 或 Streamlink 模式启用该选项后,录制会使用临时分块,并在手动分段、达到自动限制或录制结束后组装最终文件。即使没有请求手动分段,最终文件也要等组装完成后才能使用。文件收尾期间会增加磁盘空间与 I/O 开销。最终文件名遵循配置的模板,包括模板中的 %i。只有文件名已存在时,才会添加 -001 等数字后缀。本次录制的标识及尚未完成的重封装文件仅保留在 .srec-chunks-* 暂存目录中。选项关闭、输出格式不受支持或使用不受支持的自定义参数时,引擎保留原有录制行为,也不会显示该操作。如果自定义参数导致无法使用无损分段,引擎设置中会显示警告。

停止录制时,采集会在引擎的优雅停止超时内结束,随后等待剩余文件组装完成,不限时长。只有在应用关闭且超出关闭时限时,组装才会被中断。如果 FFmpeg 或 Streamlink 意外退出,退出前已采集的分块仍会组装为文件;未完成的最后一个分块会留在暂存目录中。

如果文件收尾失败、因关闭而中断或后端意外退出,请保留录制输出目录下的 .srec-chunks-* 文件夹。其中的 group-*.json 标识预期输出,group-*.ffconcat 描述已关闭的分块。可使用 FFmpeg 的 concat 解复用器和流复制,将保留的清单重新封装为新的输出文件。恢复需要手动进行;尚未完成的最后一个分块可能需要单独检查。确认恢复文件正常前,请勿删除暂存文件。

Streamlink 下载引擎的后端引擎配置 JSON 支持可选字段 ffmpeg_path。 binary_path 指定 Streamlink 本身;ffmpeg_path 指定负责重封装其输出的 独立 FFmpeg 进程:

json
{
  "binary_path": "streamlink",
  "ffmpeg_path": "/opt/media-tools/ffmpeg",
  "quality": "best"
}

后端按顺序选择配置中的 ffmpeg_path、环境变量 FFMPEG_PATH,最后使用 PATH 中的 ffmpeg。省略该字段或设为 null 会保留环境变量和默认值的行为。 包含空格的路径会作为单个可执行文件路径传递,不需要 shell 引号,也不能附带参数。 选择在创建引擎实例时确定;修改环境变量后需要重启后端。显式路径不会继承任何 已注册 FFmpeg 引擎的设置;可执行文件不存在时录制启动失败,不会自动回退。 空字符串或仅包含空白的字符串仍视为显式可执行文件值,不会触发回退; 如需清除覆盖,请省略该字段或设为 null。

引擎编辑器提供 FFmpeg 路径 字段,修改其他设置时会保留该路径。清空字段会移除该项, 恢复环境变量及默认可执行文件的查找方式。请输入后端服务器上的路径,不要添加 shell 引号;路径文本会原样保留。

在模板的 Streamlink 覆盖设置中,选择 使用引擎设置 会省略该字段并继承引擎路径。 选择 默认(FFMPEG_PATH or ffmpeg) 则写入显式 null,为该模板清除引擎路径,改用 FFMPEG_PATH 或 ffmpeg。选择 自定义 可为该模板指定路径。

可执行文件检查 ​

FFmpeg 和 Streamlink 的版本检查限时三秒,必要时随后执行有时间上限的进程清理。引擎测试和自定义引擎解析会异步执行检查。无法启动或未在期限内完成版本探测的可执行文件会报告为不可用。同步启动初始化也会等待同样的有界检查。

不存在的命名引擎配置保留默认引擎回退行为。数据库访问失败、已保存配置损坏及无效覆盖会导致解析失败,不再静默改变实际使用的配置。

受支持的 Streamlink 8.5.0 读取器可停止获取新数据,同时把缓冲数据传给 FFmpeg 完成文件收尾。此过程必须在录制停止期限内完成,强制停止可能截断最后输出。

旧版、便携版、自定义可执行文件和不受支持的读取器保留正常录制行为,但停止时可能报告 Streamlink cooperative drain incomplete。详见读取器支持范围及停止机制。

下载会话和媒体修复架构见 Mesio 内部实现。

此节内容已移至录制引擎内部实现.

此节内容已移至Mesio 引擎.

基于 MIT 许可证发布。