video-scrub

Featured

把一条视频重建成「只有画面和声音」的干净文件——**源片的元数据一概不搬**: GPS、设备型号、账号 ID、创建时间、章节、GoPro 的遥测轨,全部留在原地。 走的是白名单而不是黑名单:不列要删什么,只说带什么过去(画面一条流、声音一条流), 隐私保证来自结构,不来自枚举。 难点不在容器 tag,在**看不见的那几层**:x264 把完整编码参数写成 SEI 塞在码流里、 AAC 把版本号写进 DSE、avc1 的 compressorname 里还有一份——`ffprobe` 一个都看不见。 五个藏身处逐一堵死,每一处都有实测。 默认 `--mode copy`:**画面逐字节照搬**(cmp 验证过),只重编音频,53 秒的片子 1.3 秒跑完; `--mode encode` 完整重编码,多杀掉码流域的东西。 验收不靠声称:把源片所有元数据字符串当「针」,在输出文件里做**字节级扫描**, 扎到一根就红。12 道门全部由脚本确定性检查。 零依赖、零 API key,只要 node 和 ffmpeg。 Use when asked to 清元数据、去元数据、抹掉视频信息、视频隐私、去水印信息、 strip video metadata、remove exif from video、scrub video。

Code & Development 842 stars 104 forks Updated 5 days ago Apache-2.0

Install

View on GitHub

Quality Score: 97/100

Stars 20%
97
Recency 20%
100
Frontmatter 20%
70
Documentation 15%
100
Issue Health 10%
80
License 10%
100
Description 5%
100

Skill Content

## video-scrub 把一条视频重建成干净文件:**画面和声音带过去,元数据一个字节都不带。** `{baseDir}` = 本文件所在目录。脚本 `{baseDir}/scripts/video-scrub.mjs`,零依赖,`node` 直接跑。 ### 原理:白名单,不是黑名单 清元数据有两种思路,差别是死活: | | 怎么做 | 问题 | | --- | --- | --- | | 黑名单 | 列出要删的字段逐个删(exiftool 那种) | **删不完你不知道的东西**——厂商私有的 udta、GoPro 的遥测轨、码流里的 SEI,漏一个就漏了 | | **白名单** | 不说删什么,只说**带什么过去**:画面一条流、声音一条流,别的一律不要 | —— | 走白名单,源片的元数据**没有任何通道**能进来。它不是「被删掉了」,是从来没被搬运。 但 ffmpeg 默认会背叛这个结构两次,必须摁住: 1. **它默认把源片的容器 tag 搬到输出** → `-map_metadata -1` 2. **它默认自动挑流**,会把 GoPro 的 `gpmd` 遥测轨一起带走 → `-map 0:v:0 -map 0:a:0?` 第 2 条是 GoPro / DJI 这类源片的唯一防线:**它们的 GPS 不在 tag 里,在一条独立的定时元数据轨上。** 清 tag 清不掉,只有「只挑两条流」挡得住。 ### 真正的难点:看不见的那几层 摁住上面两条,tag 层就干净了,`ffprobe` 一片安静。**但文件里还躺着三处身份串**: | 藏在哪 | 内容 | ffprobe 看得见 | | --- | --- | --- | | H.264 的 **SEI** | x264 完整参数串 `cabac=1 ref=3 … crf=23.0` | ✗ | | AAC 码流的 **DSE** | `Lavc62.28.102` | ✗ | | avc1 的 **compressorname** | `Lavc libx264` | ✗ | 五个藏身处和各自的堵法见 `{baseDir}/references/residue-map.md`——**每一条都有实测记录, 包括几个「看着该管用其实没用」的坑**(`-flags:v +bitexact` 和 `-x264-params info=0` 都拦不住 SEI)。 ### 两种模式 | 模式 | 画面 | 音频 | 速度 | 多杀掉什么 | | --- | --- | --- | --- | --- | | **`copy`**(默认) | **逐字节照搬** | 重编 | 53 秒的片子 1.3 秒 | —— | | `encode` | 重编码 | 重编 | 慢得多 | 码流域水印、脆弱隐写 | 音频**两种模式都重编**——AAC 的版本号写在 DSE 里,那是码流内部,`-c:a copy` 抹不掉它。 重编一遍很便宜,换来音轨干净。画面则在 copy 模式下**真的一个比特都没动**(`cmp` 验证过, 除了被摘掉的 SEI)。 **关于水印**:`encode` 比 `copy` 多杀的是码流域水印和脆弱隐写,这两类在实际素材里少见。 真正要命的**鲁棒像素水印**(SynthID、影视取证水印)设计目标就是扛住重编码,**两种模式都杀不掉**。 所以选模式按画质和速度选,别指望重编码能洗掉水印。 ### 四个 profile 擦...

Details

Author
eternityspring
Repository
eternityspring/reelbench-skills
Created
2 weeks ago
Last Updated
5 days ago
Language
JavaScript
License
Apache-2.0

Similar Skills

Semantically similar based on skill content — not just same category

Code & Development Featured

video-shots

拉片:把一条成片拆成逐镜头的分析表——每个镜头的时长、景别、类别、运镜、画面。 分工刻在骨子里:**能量的都由代码量**(切点来自 ffmpeg 场景检测,时长是切点相减, 运动量是逐帧差分的中位数),模型只判断它真正该判断的那几件事(景别 / 类别 / 运镜 / 画面 / 节奏), 然后每一条判断都被代码当场对账——**声称推拉摇移却实测几乎不动,门直接拦**。 看片走联系表(每镜起手帧 + 收尾帧各拼一张大图,一屏二十几个镜头,a/b 对照就是运镜), 不是一张张翻。检测漏刀多刀用 recut 补刀并刀,自动重编号重算时长,手改边界过不了门。 产出 shots.json + Markdown 镜头表 + **单页交互式拉片报告**:内嵌播放器(播放时同步高亮镜头、 点镜头跳转)、镜头节奏带、可搜索可筛选可排序的镜头表(列表 / 卡片两种视图、首尾关键帧并排、 点图开大图)、景别类别运镜分布、出场人物、质量门、导出 JSON。单文件零依赖,离线双击能开。 15 道质量门全部由脚本确定性检查。 零依赖、零 API key,只要 node 和 ffmpeg。 Use when asked to 拉片、拆镜头、分析视频镜头、镜头时长、景别、运镜、镜头表、 video shot breakdown、shot list from video。

842 Updated 5 days ago
eternityspring
Code & Development Featured

video-sync

把拉片数据和原片合成一条**能直接看的视频**:一边是画面,一边是这一镜的分镜信息 (镜号、起止、时长、景别、类别、运镜、画面描述、台词),**镜头切了信息跟着切**, 镜头表自动滚动并高亮当前这一镜。 版式只看原片的宽高比:**横版 / 方版 → 画面在上、信息在下;竖版 → 画面在左、信息在右**, 画面永远原样缩放,不裁不拉。 镜头表**随播放滚动**:切点处滚一小段把当前镜头带到锚点、随后停住,高亮条同步滑过去。 实现上只截三张图(底板 + 铺开的长图 ×2),滚动与高亮由 ffmpeg 按时间裁窗, **布局全在 scripts/panel.css 里,改它就能改版式**,不用碰脚本。 吃 video-shots 产出的 shots.json(有 frames/ 就把关键帧当缩略图用)。 零 npm 依赖,用 ffmpeg 合成、无头浏览器渲面板。 Use when asked to 导出视频、合成视频、分镜视频、带分镜信息的视频、解说版视频、 video with shot info、annotated shot video。

842 Updated 5 days ago
eternityspring
Code & Development Listed

smart-video-editor

把多段原始素材剪成一条成片——先用视觉模型看懂每段画面拍了什么、哪几秒可用,再决定取舍、顺序、时长、调色和 BGM,最后用 ffmpeg 渲染。适用于"我给你几段视频,帮我剪一条小红书/朋友圈/vlog"这类需求。当用户提供视频文件并希望剪辑、拼接、配乐、调色、转成竖屏时使用。不做 AI 生成视频。

7 Updated 2 months ago
Fagan1024