录制分段、画面遮挡与本地合并
录制和遮挡按分段自动进行。本地合并默认需要手动执行;本文说明配置、确认处理完成及无重编码合并的步骤。
先确认自动与手动的范围
| 行为 | 当前处理方式 |
|---|---|
| 根据设定时长或文件大小分段录制 | 自动 |
| 检查已关闭的 FLV 分段中的 AAC 时间戳 | 自动,发现重复或回退时修复音频 |
| 对启用画面遮挡的房间处理已关闭的分段 | 自动,处理成功后再进入后续流程 |
| 上传多个分段至同一个 B 站稿件 | 按投稿流程处理,通常是多个分 P |
| 将短暂断流后的录像归入同一场次 | 按断流合并窗口管理工作台场次 |
| 将本地多个分段拼成一个视频文件 | 默认手动,可自行配置后处理脚本 |
多分 P 投稿和工作台场次合并都不会把本地分段拼接成一个文件。当前没有“下播后自动合并本地录像”的内置开关。
本文以支持落盘分段的下载器为前提。使用斗鱼时,账号配置和实际画质检查见斗鱼 Cookie 与画质设置。
设置自定义录制分段时长
全局设置入口是 空间配置 → 全局设置 → 视频分段时长(segment_time)。需要单独设置某个房间时,进入 直播管理 → 对应房间的配置覆写 → 下载设置。
选择 自定义时长…,填写大于零的时长并保存。以下三种写法都表示 7 分 30 秒:
| 输入格式 | 示例 |
|---|---|
| 时:分:秒 | 00:07:30 |
| 分:秒 | 7:30 |
| 秒数 | 450 |
也支持小数秒。房间级设置有三个独立状态:
- 跟随全局设置:使用全局分段时长。
- 不按时长分段:关闭该房间的时长限制,即使全局设置了时长也不采用;仍可能按文件大小、断流等条件分段。
- 预设或自定义时长:使用该房间自己的时长。
分段通常需要等到合适的关键帧边界才关闭,实际时长可能略长于设定值。保存后重新打开设置,确认选项和时长已保留;对于已经开始的录制任务,停止后重新录制可确保采用新设置。
同时检查 碎片过滤(filtering_threshold)。短分段如果小于该阈值,会被过滤,不进入投稿和后处理。启用遮挡时,程序先完成遮挡,再按原始分段大小执行过滤;被工作台引用而保留的小分段也会是遮挡后的内容。需要保留短分段用于本地合并时,应降低阈值;设为 0 可关闭按大小过滤。

在真实直播截帧上圈选遮挡区域
- 在 直播管理 中找到已保存的直播间,点击卡片或列表中的 画面遮挡。也可以进入 配置覆写 → 画面遮挡(实验性)。
- 展开面板后,等待程序取得该直播间当前的真实直播截帧。
- 打开 启用画面遮挡功能,在画面上按住鼠标左键或触屏拖拽,圈选矩形区域。
- 在区域表格里选择马赛克、模糊或纯色,调整强度或颜色;多余的区域可删除。
- 保存配置,录制一小段,等待处理完成后检查正式输出中的位置和效果。
编辑器使用一张固定截帧,圈选时画面不会移动。点击 刷新画面 可以重新抓帧,已配置的区域会保留。直播间未开播或抓帧失败时,会显示错误和重试入口;取得真实画面前不能新增区域。
画布按直播画面的实际宽高比例显示。区域位置和大小按画面百分比保存,因此不同分辨率下能保持相对位置;每个区域的宽高至少为画面的 1%,最多设置 32 个区域。直播布局发生变化后,重新抓帧并检查圈选位置。
| 效果 | 可调整项 |
|---|---|
| 马赛克 | 块大小,4–64 的整数 |
| 模糊 | 强度,1–100 的整数 |
| 纯色 | #RRGGBB 颜色,默认黑色 |
编辑器展示原始截帧和区域标记,不预览 FFmpeg 最终处理效果。马赛克和模糊不能保证内容无法辨认,需要完整遮住某处时可以选纯色。
配置用于后续分段处理,已产生的录像不会自动追溯修改。房间未设置遮挡覆写时可跟随全局 mosaic_config;显式关闭房间开关会覆盖全局的启用状态。
如果看不到入口,先确认账号有配置处理器的权限:启用 Web 鉴权时,默认只有超级管理员可操作;Fleet 托管房间需要在控制面修改。还应确认正在运行包含此功能的新版本,并强制刷新浏览器。源码构建需要先用 npm run build 更新前端 out/,后端改动需要重新编译和启动;发布构建会把前端嵌入二进制,也需要重新构建程序。

确认遮挡完成后再使用文件
需要安装包含 libx264 编码器和相关滤镜的 FFmpeg,程序复用已有的 FFmpeg 路径配置。遮挡会把视频重新编码为 H.264;时间戳正常的音频直接复制。输入是 FLV 且 AAC 音频包时间戳重复或回退时,会一并修复音频并重新编码为 192 kbps AAC。音频与目标容器不兼容、转码失败或修复结果校验失败时,保留原片并停止该分段的后续处理。
每个分段的处理顺序是:
录制原始分段 → 关闭分段 → 排队执行 FFmpeg 遮挡
→ 发布正式文件并更新工作台路径与索引
→ 碎片过滤 → 后续分段处理、投稿或本地后处理
选择 Noop(不上传) 或没有投稿模板时,已完成的分段仍会执行遮挡。当前不兼容 sync-downloader(边录边传);启用遮挡时会拒绝启动该路径,应选择 mesio、stream-gears 或 FFmpeg 等落盘下载器。
直播预览、录制中的 DVR 画面、.part 文件,以及等待处理或处理失败的原片仍可能包含原始画面。 遮挡不是实时处理。分段处理失败时不会自动回退上传原片,而是保留带 .unmasked 标记的隔离文件;不要移除标记后把它当成安全输出。
同一进程内的遮挡任务逐个执行,其他分段会排队。下播或停止录制并不代表队列已经完成。合并前,应核对日志中每个目标分段都有 画面遮挡处理完成,且没有对应失败记录,再播放正式文件检查效果。日志还会显示输出尺寸和耗时。仅看到文件存在,或仅排除 .unmasked 文件,都不足以证明整场录像没有漏段。
高分辨率和高帧率会增加 CPU 负载、处理时间与临时磁盘占用。4K60 转码可能慢于实时;缩短分段只能让单个任务更短,不能提高总处理能力。等待期间预留磁盘空间,必要时减少区域或降低录制分辨率。

FLV 音频时间戳检查与自动修复
落盘录制的 FLV 分段关闭后,程序会检查 AAC 音频包的时间戳。未开启画面遮挡时也会执行此检查;时间戳正常的文件保持原样,避免不必要的音频转码。发现重复或回退时,程序保留解码得到的音频样本,修正冲突的时间戳并重新编码为 192 kbps AAC;视频直接复制。开启画面遮挡时,此修复与视频遮挡在同一次 FFmpeg 处理中完成。
修复输出必须再次通过 AAC 时间戳严格递增检查,才会替换原文件或发布正式输出,并更新受影响的工作台索引。检查、转码或校验失败时保留原片,该分段不会进入投稿或后处理。日志会记录触发原因和失败信息;自动修复需要可用的 FFmpeg 及 AAC 编码器。
这项保护作用于升级后完成的落盘分段,不会自动修改磁盘里已有的录像,也不处理 sync-downloader 的边录边传数据。检查针对 FLV 中重复或回退的 AAC 时间戳;它不能补回源站缺失的声音、网络丢失的音频样本,也不会填平正常的前向时间间隔。
网页回看与外部播放器对 FLV 时间戳的处理可能不同。网页能正常播放,并不能证明原文件的每个音频包都兼容外部播放器。合并或分享前,仍应使用目标播放器检查正式文件的音画同步及分段接缝。
使用 FFmpeg 快速合并本地分段
最快的常见方式是使用 FFmpeg concat demuxer,配合 -c copy 直接复制音视频流。合并本身不重新编码,也不会再次损失画质;速度主要取决于文件大小和磁盘读写。此前的遮挡步骤仍需要转码。
1. 核对待合并的文件
确认目标分段已经完成遮挡并保存在本地,按实际录制时间排序。只选择同一个房间、目标场次的正式视频文件,排除:
.part、带.unmasked标记的原片及.biliup-mosaic-*、.biliup-audio-*临时文件。- 弹幕 XML、索引和其他非视频文件。
- 已经合并出的文件,避免重复拼接。
合并的分段需要音视频流结构及参数一致,包括编码、分辨率、帧率、音频采样率、声道布局和时间基等。录制中切换画质、编码或音频参数时,不能保证直接复制后正常播放;先按兼容参数分组,或另行使用统一参数转码。
可以对每个分段运行下列命令检查参数:
ffprobe -v error \
-show_entries stream=index,codec_type,codec_name,width,height,avg_frame_rate,time_base,sample_rate,channels,channel_layout \
-of json "第一段.flv"
2. 按播放顺序创建文件列表
在分段所在目录创建 UTF-8、不带 BOM 的 list.txt,第一行和示例格式如下:
ffconcat version 1.0
file '第一段.flv'
file '第二段.flv'
file '第三段.flv'
将示例文件名换成真实文件名。相对路径以 list.txt 所在目录为基准,扩展名可以是实际使用的 FLV、TS 或 MP4。列表决定播放顺序,不要只根据未经检查的目录排序生成它。示例中的单引号用于包住文件名;文件名本身含单引号时需要按 FFmpeg concat 格式转义。
3. 输出一个新的 MP4
在该目录执行:
ffmpeg -hide_banner -n -f concat -safe 0 -i list.txt \
-map 0:v:0 -map '0:a?' \
-c copy -movflags +faststart \
"合并录像.mp4"
-map 0:v:0 选择第一路视频,-map '0:a?' 保留音频并兼容没有音频的输入。-n 避免覆盖已有输出,+faststart 把 MP4 的播放索引移至开头。-safe 0 允许列表使用这些路径,请只使用自己核对过的文件列表。如果提示输出已存在,换一个新文件名后再运行,不能把此前的输出当成本次合并结果。
目标音视频编码还必须适合 MP4 容器。如果 FFmpeg 报告编码不兼容,可在兼容的情况下改用 .mkv 输出并去掉 -movflags +faststart,或另行转码;不要仅改扩展名假装转换成功。
确认 FFmpeg 成功退出后,用播放器检查开头、结尾及每处分段接缝,核对总时长、音画同步和遮挡位置。先保留原分段;无重编码合并不会补回已过滤、缺失或处理失败的部分。
需要自动合并时如何配置
可以自行编写合并脚本,在 直播管理 → 编辑主播 → 后处理 中选择 run(运行),填写脚本调用命令。程序把本次处理得到的路径通过标准输入传入,以换行分隔;这些路径可能包含视频和弹幕 XML,脚本需要区分、筛选并核对顺序。它们不是自动追加到命令末尾的参数。
普通投稿流程在本批分段处理、上传及提交结束后调用后处理;Noop 流程在本批分段处理完后调用。因碎片过滤、遮挡或上传失败而被跳过的文件不会完整出现在后处理输入里。一次调用对应的是本次处理批次,不能直接假设它就是工作台合并后的整场直播;断流重录等情况可能产生多次调用。
脚本需要自行决定如何划分场次、等待跨批次处理、避免重复执行、生成不覆盖输入的新输出,并检查 FFmpeg 结果。run 产生的新文件不会自动替换原有分段列表或已投稿的多分 P。配置时检查默认的 rm(删除文件) 步骤,避免脚本读取前文件就被删除;先用一场短录制验证,再启用日常自动化。
如果只需要偶尔合并,按上一节手动创建列表即可,无需编写脚本。当前没有能直接勾选并保证“整场下播后等待所有遮挡,再合并单文件”的内置流程。
处理器的执行阶段
| 阶段 | 可选处理器 | 执行时机 |
|---|---|---|
| 下载前处理 | run | 开始下载前执行命令,此时还没有视频文件 |
| 分段时后处理 | run、remux、render | 每个分段上传前处理;转封装和压制得到的新路径交给上传流程 |
| 下载后处理 | run | 本轮下载结束时执行命令,不等待正在进行的分段处理与上传 |
| 后处理 | run、mv、rm、webhook | 上传、投稿结束后处理结果与文件;未配置上传时在分段处理结束后执行 |
webhook 恢复旧版 { "webhook": "https://example.com/notify" } 配置格式。程序使用 POST 发送 stream_info(直播信息及房间、投稿配置)和 caught_error(成功时为空字符串)。回调须返回 HTTP 成功状态,正文为 success。所有回调通过后才执行 run、mv、rm 等文件后处理,无论回调在列表中的位置。
上传失败也会通知回调,但回调成功不会把失败的投稿当成成功。回调失败、超时或返回其他正文时保留文件并报告错误;不会因为回调失败而重新投稿已成功的稿件。普通上传、边录边传及主备接管的实际投稿均使用此规则,未执行投稿的备用节点不会重复通知。
常见问题
- 保存时提示至少绘制一个区域:启用遮挡后必须圈选区域;没有真实截帧时先解决抓帧错误。
- 录制完成后只看到未遮挡文件:检查队列是否还在处理,以及 FFmpeg、
libx264、磁盘空间和容器兼容性。处理失败的原片不会自动投稿。 - 短录像没有进入后处理或合并列表:检查碎片过滤阈值以及该段的处理、上传失败日志。
- 设置了分段时长仍提前切段:同时检查文件大小限制和断流;关闭时长限制也不会关闭其他切段条件。
- 合并后花屏或音画不同步:逐段核对音视频参数、接缝和输入完整性;参数变化或坏段需要另行处理,
-c copy不会修复它们。 - 网页回看正常,外部播放 FLV 时音频卡顿:检查日志是否报告 AAC 时间戳重复或回退,以及修复是否完成。升级后的已关闭 FLV 分段会自动检查;旧录像不会追溯修复。不要只改扩展名或直接
-c copy合并,复制音频包会保留原有时间戳问题。 - 预览里没有马赛克:检查正式分段输出;实时预览和编辑截帧显示原始画面。