dsh-video-clone:容器层 GUID 标记的视频唯一化分发

前言

多账号、多渠道分发同一支素材时,往往需要「文件能区分、画面不能动」:既要每份文件哈希不同、便于对账与溯源,又不能重新编码或改片,否则成本与画质风险都会上来。常见做法是改文件名或外挂清单,但文件一旦被拷贝或重命名,链路与账号的对应关系就容易断。

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):

  1. 字节布局(layoutOk):未触碰区间与源一致,写入区间回读一致。
  2. 哈希互异(hashesAllDistinct):N 份的 sha256、md5 两两不同,且均不等于源文件。
  3. 媒体层(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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜