前言¶
多账号、多渠道分发同一支素材时,往往需要「文件能区分、画面不能动」:既要每份文件哈希不同、便于对账与溯源,又不能重新编码或改片,否则成本与画质风险都会上来。常见做法是改文件名或外挂清单,但文件一旦被拷贝或重命名,链路与账号的对应关系就容易断。
DeepSeek Harness(DSH)把能力拆成可装载插件。下面介绍社区插件 dsh-video-clone(维护者 2015215218,分类:客户端):在只改容器、不碰码流的前提下,把一支视频复制成 N 份,每份写入唯一 GUID,并产出 guid→文件→标签 的溯源账本;同时提供 DSH 工具、Web 工作台面板与 CLI。目录页见 SkillHub,源码与文档在 GitHub(MIT,Node.js ≥ 18,当前包版本 1.0.0)。
这是什么¶
一句话:复制 N 份,每份塞一个唯一 GUID,让整文件哈希各不相同,编码流与解码帧与源文件逐字节一致。
插件在 DSH 宿主侧注册两个工具:video_clone(批量克隆)与 video_clone_scan(从文件反查标记与 GUID)。Web 半边在侧边栏提供「视频唯一化」工作台;命令行入口为包内 bin/video-clone.js(package.json 中 bin 名 video-clone)。
原理:只改容器,不碰码流¶
核心思路是按容器规范在「播放器会跳过或仅当元数据读取」的位置写入标记,不重编码、不改采样。
| 容器 | 写标记的位置 | 说明 |
|---|---|---|
| MP4 / MOV | moov/udta/meta/ilst/©cmt(ffprobe 的 comment)+ 文件尾 free box |
注释为元数据;free 为规范填充盒 |
| MKV / WebM | Segment 内 Void + Tags/SimpleTag |
Void 为填充;Tags 为元数据 |
| AVI / RIFF | 尾部 JUNK chunk,并修正 RIFF size |
JUNK 为标准填充 chunk |
| MPEG-TS / M2TS | 尾部 null packet(PID 0x1FFF) | 载荷可为任意值,解复用器丢弃 |
| FLV | 尾部 script data tag(onXCLN) |
未知脚本标签通常被忽略 |
| 无法识别 | 文件尾追加 | 前缀仍为完整副本 |
改 MP4 时若 moov 变长,实现会同步修正 stco/co64 绝对偏移;否则文件可能能播但花屏。同一次调用产出的 N 份体积一致:填充按 padBytes 做 64 字节对齐,避免标签 UTF-8 长度不同导致每份差几字节。
写入策略由 mode 控制:both(默认,可见元数据 + 隐形填充)、pad(仅填充)、meta(仅元数据)。默认 both 是为应对转码或剥离元数据后仍可能从填充位溯源。
三重自证与账本¶
每次克隆运行会做三类校验,结果写入输出目录账本(ledger.json、ledger.jsonl、ledger.csv):
- 字节布局(
layoutOk):未触碰区间与源一致,写入区间回读一致。 - 哈希互异(
hashesAllDistinct):N 份的 sha256、md5 两两不同,且均不等于源文件。 - 媒体层(
streamIdentical/framesIdentical):ffmpeg -f streamhash比编码流,或-f framemd5逐帧比像素。
任一项不通过则整体 ok 为 false。README 特别强调:若 ffmpeg 校验无输出,旧逻辑可能把两个空串判为相等而误报通过;当前实现为「拿不到证据就失败」,并把原因写入 notes / media.error。媒体层校验依赖本机 ffmpeg;无 ffmpeg 时 README 说明会降级为哈希校验。
deriveFromLabel 可用标签确定性推导 GUID,便于账本丢失后按标签重算比对。
核心功能(DSH 侧)¶
工具 video_clone¶
典型调用形态(参数名与 README 一致):
video_clone(input="素材.mp4", count=10, labels=["账号A","账号B",...], outputDir="分发")
常用参数摘要:
| 参数 | 说明 |
|---|---|
count |
份数,默认 5 |
mode |
both / pad / meta |
labels |
每份标签,写入标记与账本 |
deriveFromLabel |
由标签确定性生成 GUID |
namePattern |
文件名模板:{name} {i} {i:03} {guid} {label} {ext} |
verify |
frames(默认)/ media / hash / off |
strictSize |
要求副本体积与源完全一致;无足够 free 或注释空间则报错 |
工具 video_clone_scan¶
在已有文件中查找标记,反查 GUID 与对应份次。
Web 工作台¶
package.json 声明 dsh.client.platform: "web",客户端导出 ./client → client.js。侧边栏「视频唯一化」面板支持选源、设份数/标签/策略/校验级别、异步任务进度(clone 返回 jobId,轮询 job),并展示每份标签、路径、大小、GUID、sha256 与自证结果;底部可贴路径反查 GUID。
选源支持系统原生文件对话框(macOS / Windows / Linux 分别调用对应 API)与目录浏览。宿主 HTTP 路由前缀为 /video-clone/api,仅 POST,并受浏览器信任 fence 约束。面板状态通过 localStorage 持久化;与工具、CLI 共用同一套 cloneVideo 实现。
本地开发时 README 说明 profile 可用 file: 指向仓库目录的软链;修改源码后需重启 DSH,已 import 的模块不会因 plugin_manager 热重载而更新。
安装与启用¶
SkillHub 目录页标注该插件可安装、表面包含 host 与 web(dshhub.surfaces),分类为工具/媒体。抓取资料中未给出统一的 dsh plugin add … 单行安装命令;请以你当前 DSH 版本对应的插件安装方式,从 目录页 或仓库 README 为准。
装载契约(写错会导致插件静默不激活或面板空白,README 有测试守卫):
package.json的exports["."]必须指向index.js(含apply),不能指到lib/index.js。index.js须导出inject且包含"tools";客户端须声明inject(本插件为['slots', 'layout'])。- Web 半边:
exports["./client"]→client.js,且main的key与sidebar.panellist的id逐字相同;先注册main再注册sidebar.panellist。
插件以当前 DSH 进程的用户权限读写文件、调用本机 ffmpeg 与系统文件对话框。安装或启用前请自行审阅 源码与许可证,勿在未信任的环境对敏感素材直接操作。
典型用法¶
CLI¶
# 复制 10 份,按账号打标签,逐帧校验
node bin/video-clone.js clone 素材.mp4 -n 10 -l 账号A,账号B,账号C --verify frames
# 反查文件中的 GUID
node bin/video-clone.js scan 分发/*.mp4
# 干跑:只输出规划,不落盘
node bin/video-clone.js plan 素材.mp4
# 查看容器结构
node bin/video-clone.js info 素材.mp4
仓库内测试入口(README 记载):
node test/run-tests.js
node test/plugin-tests.js
完整 npm test 还包含 test/web-tests.js 与 test/version-tests.js。
适用场景与边界¶
适合:同一画面素材多路分发时的唯一文件标识、事后按 GUID/账本溯源、与智能体工作流结合(DSH 工具可调参批量出盘)。
务必知道(摘自 README「边界」):
- 不能替代平台内容层查重。画面与音轨未变,感知哈希/视频签名类比对仍可能判为同一内容。
meta模式注释可能被转码或-map_metadata -1剥离;需要韧性时建议默认both。©cmt为明文,ffprobe可读;若不想在元数据里显眼,可用mode=pad。- 不做转码、不加片头片尾;分片 MP4(fMP4 / DASH)不重排
moov时会降级为尾部追加。
结尾¶
dsh-video-clone 把「哈希互异 + 媒体零改动 + 可审计账本」收进一个 DSH 客户端插件:宿主工具、Web 面板与 CLI 共用同一实现,并对布局、哈希与媒体层做显式自证。需要试用或集成时,从 SkillHub 目录 进入安装说明,细节与实测表见 GitHub README。