mcpField
S
steal

steal

github.com/melvynx创意与媒体64388 次安装1 周前更新
代码仓库

关于 steal

steal 是面向视频创作者的 video-agent 技能,用于复现参考短视频的剪辑风格。它测量画面、声音和节奏,生成可复用的样式文件,并先用一段素材测试。

主要功能

  1. 01测量画面、剪切点和布局
  2. 02分析音效与节拍
  3. 03跟踪人脸尺寸和缩放
  4. 04编写可复用的样式文件
  5. 05渲染并对比测试剪辑

适用场景

  1. 01复现参考短视频的视觉风格
  2. 02在录制素材上测试样式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/melvynx/video-agent-skills --skill steal

安装后在 Claude Code 中输入/steal确认已加载。

附带文件references/learnings.md

详细介绍

Steal

你喜欢别人视频中的剪辑效果,想用在自己的视频上。此技能会测量对方的剪辑效果,将其记录为一种风格,并先用你的一段素材进行测试,再正式使用。

输出:

  • video-agent/styles/<name>/style.json:引擎读取的风格文件,可通过 /short-editing <take> style <name> 使用。
  • video-agent/styles/<name>/STYLE.md:记录测量结果,以及引擎无法表达的规则。
  • video-agent/styles/<name>/stills/(原视频的关键帧)和 assets/(其音效和徽标;每个使用该风格的短视频都会复制这些素材)。
  • video-agent/edits/short-<slug>-<name>/output/short-<slug>-<name>.mp4:测试视频。

开始前先阅读 references/learnings.md。其中的每条规则,都来自一份被否决的仿制作品。

如何运行

  • 预检:ffmpeg -version && yt-dlp --version。缺少工具时:/studio-setup tools。
  • 使用创作者的语言交流。每个较长步骤开始前,用一行说明你要做什么。
  • <name>:创作者账号名的小写形式,单词之间用连字符;用户指定风格名时则使用指定名称。
  • 临时文件放在 video-agent/.tmp/steal-<name>/(下文中的 W)。

1. 获取短视频

  • 本地文件:直接使用。
  • YouTube 链接:yt-dlp -o "W/reel.%(ext)s" "<url>"。
  • Instagram 或 TikTok:先尝试 yt-dlp。如果被拦截(登录墙),且已配置 Treg(treg balance 有响应),则运行 treg catalog search "download an Instagram reel video file",再运行 treg catalog get <id> 查看价格,接着运行 treg call <id> --query url=<url>,并下载其返回的视频 URL。否则,请用户保存视频并提供文件。
  • 条件允许时,研究同一格式的 2 或 3 个短视频。单个短视频可能只是例外。

2. 测量

完成以下全部三轮分析。只从画面复制风格会漏掉一半信息:声音和节奏也很重要。

使用子 Agent 可加快进度。 如果你的 Agent 能运行子 Agent(Claude Code、Codex),先自行制作图表和 cuts.txt(见下方第一段),然后同时将 Frames、Sound 和 Zooms 分配给三个子 Agent。提供每个 Agent 的绝对路径、完整复制的对应章节,以及各自要写入的单个文件:W/notes-frames.md、W/notes-sound.md、W/notes-zooms.md。只记录数字和时间戳,不要外放音频。子 Agent 工作时,你自己查看图表:由你判断视觉效果,由它们提供数据。然后根据它们的笔记编写风格。没有子 Agent 时,依次完成各轮分析。

画面与剪辑
ffmpeg -v error -y -i W/reel.mp4 -vf "fps=2,scale=270:480,tile=8x3:padding=4:color=black" W/sheet-%02d.jpg
ffmpeg -hide_banner -i W/reel.mp4 -vf "scdet=threshold=12" -an -f null - 2>&1 | grep -o "scd.time: [0-9.]*" | cut -d' ' -f2 > W/cuts.txt
ffprobe -v error -show_entries format=duration -of csv=p=0 W/reel.mp4
  • 每张图表包含 24 个缩略画面,每秒 2 个。第 N 张图表中的第 i 个缩略画面(从 0 开始),对应的时间为 12(N-1) + i/2 秒。
  • 每个镜头的秒数 = 时长 /(cuts.txt 中的行数 + 1)。

阅读每一张图表,并记录:

  • 布局:完整画面、分屏(分割线的位置)、纯色背景加文字、纯色背景上的抠像人物、B-roll、截图。
  • 字幕,按布局区分:字体观感(紧凑、圆润、衬线)、大小写、字重、字号、在人物身上的位置、单词的出现方式,以及强调哪个词和如何强调。
  • 图卡与图片:类型、边框、尺寸、出现时间(是否与提及它们的词同步?),以及是否会叠放。
  • 钩子(前 2 秒)、CTA(最后 3 秒)、调色(明亮平淡,还是对比强烈且色调偏暗)。

将 6 到 10 张关键静帧保存到 video-agent/styles/<name>/stills/:

ffmpeg -v error -y -ss <seconds> -i W/reel.mp4 -frames:v 1 video-agent/styles/<name>/stills/t<seconds>.jpg
声音
ffmpeg -v error -y -i W/reel.mp4 -lavfi "showspectrumpic=s=3000x500:legend=0:scale=log:stop=11000" W/spectrum.png
  • 图像宽 3000 px,因此 t 秒处的切点位于 x = 3000 × t / duration。对照 cuts.txt 阅读。
  • 靠上方明亮、细窄的垂直线 = 点击声。宽而靠下 = 轰鸣声。向上延伸的模糊痕迹 = 呼啸声。稳定的音乐频带中出现横向暗带 = 节拍中断。
  • 放大一个切点,查看其撞击声:ffmpeg -v error -y -ss <cut - 1> -t 2 -i W/reel.mp4 -lavfi "showspectrumpic=s=1000x500:legend=0:scale=log:stop=11000" W/cut-<n>.png。
  • 节拍:在频谱图上数出 10 s 内规律出现的低频线条(或播放时跟着打拍子):10 s 内的线条数 × 6 = BPM。

人声下方的音乐音量(可选,需要在 video-agent/.env 中配置 ELEVENLABS_API_KEY,会消耗少量额度,请先说明):

set -a; . video-agent/.env; set +a
ffmpeg -v error -y -i W/reel.mp4 -vn -ac 1 -ar 44100 W/full.wav
curl -s -X POST https://api.elevenlabs.io/v1/audio-isolation -H "xi-api-key: $ELEVENLABS_API_KEY" -F audio=@W/full.wav -o W/voice.mp3
ffmpeg -v error -y -i W/voice.mp3 -ac 1 -ar 44100 W/voice.wav
for f in full voice; do ffmpeg -v error -i W/$f.wav -af "asetnsamples=882,astats=metadata=1:reset=1,ametadata=print:key=lavfi.astats.Overall.RMS_level:file=-" -f null - | grep -o "RMS_level=.*" | cut -d= -f2 > W/rms-$f.txt; done
paste W/rms-voice.txt W/rms-full.txt | awk '$1<-40{print $2}' | sort -n | awk '{a[NR]=$1}END{print "music while the voice is silent:", a[int(NR/2)+1], "dB over", NR/50, "s"}'
awk '$1>-30' W/rms-voice.txt | sort -n | awk '{a[NR]=$1}END{print "voice while talking:", a[int(NR/2)+1], "dB"}'
  • 这些命令每隔 20 ms 测量一次音量。分离出的人声静音时,音乐就是完整混音中的内容。
  • 人声下方的音乐 = 人声音量减去音乐音量。
  • 静音不足 1 s(即每个停顿都被剪掉的剪辑)时,数据不够可靠:请根据频谱图判断。
  • 切勿从混音中减去分离出的人声:它与原音不在同一相位,因此结果会比人声更响。
  • 没有密钥时,请根据频谱图判断音量。

记下音乐开始的位置,以及每个事件对应的声音:切点、板子、缩放、撞击。

缩放

在分镜表上,测量约 10 个画格中人脸高度占画格高度的比例,并列出相邻画格之间人脸大小的变化:

  • 在切点处变化 = 两个镜头之间的取景变化
  • 镜头内变化 = 推近
  • 镜头内缓慢增大 = 推镜头

写明范围(例如人脸占画格的 12% 到 25%)、每 10 s 的推近次数,以及是否有推镜头。这些数值是你仿制时的上限。

3. 编写风格

用用户的语言编写 video-agent/styles/<name>/STYLE.md,包含与 short-editing 的 style.md 相同的章节。每一行都写明一个值及其测量依据:

# Style: <name>

Copied from <link>, measured on <date>. Applied on top of short-editing's style.md: what is not here stays as there.

## Cuts
- hard cut every 1.4 s on average (35 cuts in 50 s); no fade, no transition
## Framing
- face 12 to 25 % of the frame; punch-in 1.1 at most, about every 4 s, held until the next cut; slow push 0.6 %/s
## Captions
- ...
## Boards and images
- ...
## Sound
- boom bap beat ~90 BPM from the hook impact, 12 dB under the voice, drops out 0.3 s on punch-ins
- a dry high click on most cuts (assets/sfx/cut.mp3), a pop on each board (assets/sfx/pop.mp3)
## Grade
- ffmpeg: eq=contrast=1.08:saturation=0.9,vignette=PI/5,unsharp=5:5:0.4
## Left out
- the AI video clips: replaced by your own footage or a board
## How short-editing applies it
- what goes in each spec by hand (an HTML component, a layout key, a B-roll moment)

然后编写 video-agent/styles/<name>/style.json,为引擎支持的每个键填写最接近的值;键须与 short-editing 的 style-schema.md 一致:colors、font / display、captions(26 种样式:stack 用于叠加在画面上的大号紧凑文字,band、dim、rise、hard 等)、paper(纯色背景使用 bg: 'flat')、layout.seam、cuts: 'hard'、zoom.drift、pace.speed、grade(ffmpeg 滤镜链)、sfx.kit(assets/sfx/ 中的切点、弹出和冲击声效文件)、music.dropOn,以及引擎无法实现的规则(写入 notes)。assets/looks.json 中的海报风格是对硬切创作者风格的实测仿制;卷轴视频采用硬切时,从该风格开始。卷轴视频中出现的 Logo 放入 assets/logos/。

音效(位于 video-agent/styles/<name>/assets/sfx/):从随 short-editing 一起发布的素材库中选取,默认绝不生成。

  • 在 <short-editing>/assets/sfx/ 中选择最接近的文件(用途及列表见 short-editing 的 references/sfx.md):zhhh、impact-boom、riser、glass-shatter、pop-back 适用于钩子转场、揭示和高潮。将它们复制到风格的 assets/sfx/ 中,并在 sfx.kit / sfx.files / notes 中引用。
  • 引擎自带的声音(sfx.extra 中的 thud、pop、tap、bell、tom)适用于无需文件的轻柔撞击声。
  • 只有当原视频中的声音与上述声音都相差甚远,且创作者同意(这会消耗他们的额度)时,才使用 ElevenLabs 生成 2 或 3 个版本,并保留最接近的版本:
    curl -s -X POST https://api.elevenlabs.io/v1/sound-generation -H "xi-api-key: $ELEVENLABS_API_KEY" -H "content-type: application/json" -d '{"text":"single dry short high click, tight transient, no reverb","duration_seconds":0.5}' -o video-agent/styles/<name>/assets/sfx/cut-a.mp3
    

图像:创作者放在屏幕上的图片(产品、屏幕截图)会成为画板上的 img 项;只有在没有图片时,才使用 /codex-images 生成一张,绝不生成脸部图像。

Logo:屏幕上提到的每个应用都应显示其真实 Logo,绝不用圆圈中的字母代替。

4. 测试

  1. 从 video-agent/takes/ 中选取一段 10 到 20 s 的用户视频。
  2. 运行 /short-editing <take> style <name>。init 会快照该风格并复制其 assets/;规范会补充 STYLE.md 针对每条短视频的要求(布局键、推近镜头、在提到看板的词语处显示看板)。
  3. slug 为 <take slug>-<name>。

5. 展示前进行比较

将原视频放在上方,副本放在下方,时间保持一致:

ffmpeg -v error -y -i W/reel.mp4 -i video-agent/edits/short-<slug>/output/short-<slug>.mp4 -filter_complex "[0:v]fps=1,scale=216:384,trim=end_frame=15,tile=15x1[a];[1:v]fps=1,scale=216:384,trim=end_frame=15,tile=15x1[b];[a][b]vstack" -frames:v 1 W/compare.jpg

逐个画面检查:

  • 字体大小和字重
  • 看板和 Logo 的大小(应像原视频一样填满空间)
  • 调色
  • 原视频硬切的地方不要添加淡入淡出
  • 字幕不要挡住嘴部
  • 画面不要倒置

也要对副本运行频谱图分析:音效必须落在切点上,节拍在语音下方的音量必须一致。测量各张画面中的人脸尺寸:推近镜头不能多于原视频,人脸绝不能更大。

使用子 Agent 时,把对比表、关键静帧和上述清单交给一名全新的子 Agent 检查,同时你检查声音和推近镜头:它会报告每个不一致的画面。展示前修复所有差异。绝不要让用户成为发现问题的人。

6. 交付

打开测试视频,然后用几句话告诉用户:

  • 测量了哪些内容(每个镜头的秒数、BPM、音乐音量、推近镜头)
  • 复制了什么,省略了什么,以及原因
  • 风格存放的位置

从现在开始,/short-editing <take> style <name> 会使用该风格。用户每次拒绝某项内容,都要将其写入 STYLE.md(以及 style.json 的 notes)。如果经验具有普遍性,将其添加到 references/learnings.md。

评论

支持 Markdown