前言¶
在 DeepSeek Harness(DSH)里做本地批处理时,常见需求是把一批目录下的短视频拼成一个文件:课程分集、录屏分段、监控或素材按日期的切片等。手工用 ffmpeg 逐个目录写 concat 列表,再判断能否 -c copy、规格不一致时又要对齐第一个片段,既重复又容易漏目录。
下面介绍的 dsh-video-merger(维护者 a-mochis)是 DSH 的客户端(Web UI)插件:递归扫描目录树,按文件夹分组;每个至少包含 2 个视频的文件夹输出一个合并文件。片段编码、分辨率、帧率、像素格式与音频布局一致时走无损 remux;不一致时才按第一个片段规格归一化后再拼接。
插件仓库:https://github.com/a-mochis/dsh-video-merger
社区目录页:https://www.skillhub.cn/plugins/a-mochis/dsh-video-merger
许可证:MIT(package.json 中版本为 1.0.4)。
这是什么¶
一句话:在指定根目录下,每个子文件夹各生成一个合并视频,尽量保持源规格不变。
同一套合并引擎提供三种入口:
- 会话内 视频合并 / Video Merge 标签页的 Web UI;
- DSH 工具
merge_folder_videos; - 独立 CLI:
node bin/merge-videos.mjs(需本机 Node.js 20+)。
运行时依赖本机 ffmpeg 与 ffprobe(可放在 PATH、在插件中指向其目录;Windows 上 UI 可下载已知可用构建)。插件本体无运行时 npm 依赖;npm install 仅用于跑客户端测试。
核心功能¶
根据仓库 README,已核实的能力包括:
- 按文件夹分组:递归扫描根目录;仅当文件夹内视频数 ≥ 2 才合并;片段默认按文件名排序(也可选
mtime)。 - 默认可无损:规格一致时用 ffmpeg concat demuxer 且流复制(
-c copy),不重新编码。 - 规格不一致时回退:分辨率、帧率、编码、音频布局混合时,对齐到第一个片段再拼接(
reencodeFallback默认真)。 - 可选统一输出:可将所有结果集中到同一输出目录,或写回各源文件夹。
- Web UI:内置目录浏览、文件夹勾选、进度/速度/ETA、取消、播放、在文件管理器中显示;管理对话框可清理当前选择、历史根目录或合并记录。
- 输出命名与再扫描:输出名为
<folder>_merged.<原扩展名>;统一输出模式下用相对路径前缀避免重名;已存在的*_merged.*在下次扫描时会被忽略(除非开启覆盖)。
处理流程可概括为:扫描目录 → ffprobe 各片段 → 比较签名 → 相等则 concat + copy,不等则按首片段归一化后拼接。
环境与依赖¶
| 项目 | 说明 |
|---|---|
| DSH | 带 Web UI 的桌面或浏览器配置;package.json 要求 dsh >=0.2.0-0 |
| ffmpeg / ffprobe | 执行合并;需可用且可被插件找到 |
| Node.js 20+ | 仅在使用 CLI 或运行仓库测试时需要 |
安装与启用¶
安装本质是向 DSH 注册本地 bundle,官方 README 给出两类方式(示例路径请换成你本机目录)。
方式一:安装本地 bundle¶
在 DSH 中调用 plugin_manager 工具:
plugin_manager install_bundle target = <dsh-video-merger 的绝对路径>
也可从 latest release 下载打包 zip,解压后对解压目录执行同样的 install_bundle。
安装或更新后,在 Web UI 中强制刷新(Ctrl+Shift+R)。打开任意会话,在会话标签栏选择 视频合并 / Video Merge。
方式二:Discover 个人索引¶
在 DSH 中打开 Plugins → Discover → Index sources → Add index source,粘贴:
https://cdn.jsdelivr.net/gh/a-mochis/dsh-video-merger@main/market/index.json
Discover 中会出现 Video Merger 卡片,安装的仍是同一 bundle。该索引由仓库维护,不等同于社区精选目录的正式条目;细节见仓库 docs/marketplace.md。
典型用法¶
Web UI¶
- 打开 视频合并 标签。
- 选择根目录(可浏览、返回上级或直接输入路径),点击 选择此文件夹。
- 在列表中勾选要合并的文件夹,可展开查看片段顺序;取消不需要的项。
- 统一输出到同一个文件夹:勾选则集中输出(默认输出路径为扫描根目录);不勾选则各结果写回对应源文件夹。
- 点击 开始合并,查看各文件夹与总进度;完成后可播放或在文件管理器中打开结果。
- 页头 管理 / Manage 可切换最近根目录、清理选择或历史。
DSH 工具 merge_folder_videos¶
merge_folder_videos root="E:\videos" recursive=true outputDir="E:\videos\merged"
常用参数(节选,完整表见 README):
| 参数 | 默认 | 含义 |
|---|---|---|
root |
必填 | 扫描根目录 |
folder |
– | 只合并该文件夹,不扫全树 |
recursive |
true |
是否扫描子目录 |
order |
name |
name 或 mtime |
overwrite |
false |
是否覆盖已有输出 |
reencodeFallback |
true |
规格不一致时是否归一化后合并 |
deleteSource |
false |
成功后是否删除源片段 |
outputDir |
– | 统一输出目录 |
wait |
true |
false 时立即返回 job id |
CLI¶
node bin/merge-videos.mjs "E:\videos" --out "E:\videos\merged"
其它开关包括 --no-recursive、--folder <path>、--order name|mtime、--overwrite、--no-reencode、--delete-source、--ffmpeg <dir>、--json。退出码:0 全部成功,1 至少一处失败,2 参数错误,3 找不到 ffmpeg/ffprobe。
适用场景与注意¶
适合:本地素材树按「每个文件夹 = 一集/一天/一个场景」组织,需要批量生成 *_merged.* 且希望同规格目录尽量不重编码的用户;希望在 DSH 会话里用图形界面完成,或把合并挂进智能体工具链的场景。
注意:
- 插件在当前 DSH 进程权限下读写你选择的目录;安装前请自行审阅源码与 MIT 许可证,确认路径与
deleteSource/--delete-source等选项符合预期(默认不删源文件)。 - 规格不一致的文件夹会转码,耗时与画质取决于首片段规格与内容;若希望跳过混合规格目录,可对 CLI 使用
--no-reencode,或将工具的reencodeFallback设为false。 - 社区目录(如 skillhub.cn)用于发现与链接,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本插件分类为客户端,侧重 Web UI 与本地文件操作。
结尾¶
dsh-video-merger 把「按文件夹扫树 → 判断能否无损拼接 → 必要时对齐首片段」封装进 DSH:图形界面、merge_folder_videos 与 CLI 共用同一引擎,适合在智能体工作流里批量整理分段视频。