本文へ移動
cccskills
無料GitHub で公開

meme-creator

Creates video/GIF memes by overlaying images (logos, avatars, stickers) onto moving objects in a clip with frame-accurate tracking, then exports MP4 + GIF. Use whenever the user wants a meme, 梗图, 表情包, or reaction GIF from footage; to cover faces in a video; or asks to 把 logo/头像贴到视频里跟着动. Not for transcript-driven editing, programmatic scene generation, or subtitle work.

インストール方法を見る

含まれるファイル(7)

  • SKILL.md7.1 KB
  • references/asset-binding.md4.8 KB
  • references/tracking-playbook.md4.2 KB
  • scripts/encode_outputs.sh2.3 KB
  • scripts/make_sheets.py5.4 KB
  • scripts/render_overlay.py7.2 KB
  • scripts/track_boxes.py6.0 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Meme Creator

Turn a video clip into a meme: images (logos, avatars, stickers) glued onto moving objects so they follow the motion frame by frame, delivered as MP4 + GIF.

The failure mode that ruins this is not tracking drift — it is gluing the wrong person's avatar on screen because a name was bound to the first plausible account found. So step 0 is identity, not tooling.

For a static image meme, skip tracking entirely: put one manual_keys entry per target ([[1, [x, y, w, h]]]) in the overlays config and render just that frame — --tracks is optional when every position comes from keys.

Requirements

  • ffmpeg on PATH
  • uv — all bundled Python scripts carry inline dependencies; run them with uv run <script> and deps resolve themselves
  • yt-dlp only when downloading (uv run --with yt-dlp yt-dlp ...)
  • Chrome/Chromium only when rasterizing an SVG logo (asset-binding.md)
  • Script paths below are written scripts/… relative to this skill's bundle directory. Resolve the bundle path once (SKILL_DIR=<path to this skill>) and run "$SKILL_DIR"/scripts/make_sheets.py … — your working directory is the scratch dir, not the bundle.

Pipeline

Work inside a scratch directory (/tmp/<meme-name>/ or similar), deliver only the final MP4 + GIF.

0. Bind identities before fetching assets

When the user names who/what goes on screen ("Codex, Claude, and Tibo's avatar"), every ambiguous name must survive the disambiguation gate in references/asset-binding.md — enumerate candidates with a handle-free search, discriminate from the request context (the peer entities listed alongside are the strongest signal), and ask the user when context cannot decide. That file also covers logo/avatar sourcing, SVG→PNG with real transparency via headless Chrome, and badge styling. Fetch and eyeball every image before compositing it.

1. Acquire the source

Local file: use it. URL: yt-dlp handles bilibili (incl. b23.tv short links), YouTube, and most sites:

uv run --with yt-dlp yt-dlp -f "bv*+ba/b" --merge-output-format mp4 -o "source.%(ext)s" "<url>"

If a domestic-CN site fails with a proxy tunnel error, retry with --proxy "" (a local HTTP proxy breaks some domestic CDNs); if an international site times out, retry with the local proxy.

Check duration: ffprobe -v error -show_entries format=duration -of csv=p=0 source.mp4

2. Locate the segment

Never track "the whole video." Find the exact scene with a 1–2 fps contact sheet, then expand around it:

ffmpeg -v error -ss <start_s> -t 40 -i source.mp4 -vf "fps=1,scale=240:-1,tile=5x8" -frames:v 1 contact.png

Read the sheet, pick the beat boundaries (entrance → action → exit), and cut the final segment ±1 s of padding. Extract the frame sequence at native fps:

mkdir -p seq && ffmpeg -v error -ss <seg_start> -i source.mp4 -t <seg_dur> seq/f_%04d.png
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of csv=p=0 source.mp4

3. Prep overlay assets

One image per target, PNG with alpha. Unify mixed assets (app icon + logo mark

  • photo avatar) as circle-white badges — see asset-binding.md for why and for the avatar circular-mask handling.

4. Track the targets

Full procedure and failure taxonomy: references/tracking-playbook.md. Short form:

  1. Grid one frame where all targets are fully visible: uv run scripts/make_sheets.py grid --frames 'seq/f_%04d.png' --index 30 --out grid.png and read each target's [x, y, w, h] box off the grid.
  2. Write the tracking config (targets + init frame), run: uv run scripts/track_boxes.py --frames 'seq/f_%04d.png' --config track.json --out tracks.json --last <N>
  3. Verify: uv run scripts/make_sheets.py tile --frames 'seq/f_%04d.png' --tracks tracks.json --start 1 --end <N> --step-frames 15 --out verify.png and look at every tile.
  4. Fix what the tiles show: re-anchor later segments (shot changes, scale blowups, drift), or take over a smooth long shot with manual_keys. Expect 2–3 rounds. Then mark visible/fade_in/fade_out for every exit, entrance, and empty-stretch — a logo parked on an empty frame is the most visible possible bug.

5. Render

uv run scripts/render_overlay.py --frames 'seq/f_%04d.png' --tracks tracks.json \
  --overlays overlays.json --out 'out/o_%04d.png' --last <N>

Spot-check a rendered contact sheet (make_sheets.py tile over out/) before encoding — much cheaper than re-encoding.

6. Encode + size budget

scripts/encode_outputs.sh --frames 'out/o_%04d.png' --fps <native_fps> \
  --source source.mp4 --ss <seg_start> --t <seg_dur> --mp4 meme.mp4 \
  --gif meme.gif --gif-width 400 --gif-fps 10 --gif-colors 96

GIF size is driven by frame count × dither noise, not palette size. To fit a ~10 MB chat-app budget, lower knobs in this order: --gif-fps (15→12→10), then --gif-width (480→400), then --gif-colors (128→96).

7. Verify the encoded deliverables, then deliver

Extract frames from the final MP4 and the final GIF (ffmpeg -ss <t> -frames:v 1) and look at them — the earlier checks verified intermediates; this one verifies what the recipient will actually see. Deliver both files by their exact paths.

Troubleshooting

SymptomCauseFix
yt-dlp: Tunnel connection failed 503 on a domestic sitelocal HTTP proxy interceptingadd --proxy ""
cairosvg/svglib crash: no library called cairomissing system cairorasterize SVG via headless Chrome (asset-binding.md)
Tracker dies exactly at a shot changeCSRT cannot cross cutsnew segments entry at the new shot's first frame
Box drifts slowly off the target over ~1 mintemplate pollutionre-anchor with the tracker's own last-good box, or manual_keys
Logo parked mid-frame after subject exitsmissing visibility windowfade_out before the exit, no visible range after
GIF massively over budgetdither noise × frameslower --gif-fps first, then width, then colors
Logo looks fine in PNGs but wrong in the GIFchecked intermediates onlyalways verify frames from the encoded file (step 7)
Encode fails: Failed to set value '1:a' for option 'map'source clip has no audio streamthe bundled script maps 1:a? (optional); if running ffmpeg by hand, do the same or drop --source

References

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Fixes web search on an agent whose model backend can't run it: a relay/reseller proxying Claude or Codex returns empty instead of failing. Use when web search returns nothing, a model insists a shipped product doesn't exist, someone wants to give an agent internet access, or the user is on a third-party base URL, relay, or 中转站. Diagnoses which built-in tools are dead, removes them, and installs a working replacement.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4512026年10月11日 更新

抓取 A 股消息面情报:从财联社、华尔街见闻、金十、新浪 7x24、东财快讯、 证监会/央行/上交所/财政部政策公告、东方财富股吧等公开来源抓取与股票相关的 新闻、政策、情绪,输出结构化 JSON 或 Markdown。 当用户提到“A 股消息面”、“抓新闻”、“个股消息”、“政策监管”、“股吧情绪”、 “财联社”、“东财快讯”、“市场情绪”或需要把某只股票相关的公开情报聚合出来时 触发。也适用于“帮我看看 000001 最近有什么消息”这类口语化请求。

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4512026年10月11日 更新

Transcribes audio or video to speaker-labeled, timestamped text, locally with MLX on Apple Silicon or remotely. Use for 转录 / 录音转文字 / 说话人分离 / 字幕, and also for preparing audio for ASR without transcribing: 转格式, 降采样到 16kHz, merging recorder segments, or compressing and speeding up audio before 飞书妙记 — even when it looks like a one-line ffmpeg job.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4512026年10月11日 更新

Routes audio: StepFun ASR/语音识别, StepFun TTS/配音, transcript/妙记→会议纪要, merge/review minutes. Reads one bundled specialist; generic ASR and correction stay direct.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4512026年10月11日 更新

Diagnoses and repairs repository setup and guarded Git workflows for Claude Code or Codex — environment repair, startup sync, hook auditing, collaborator handoff. Use when a repo won't run, a teammate onboards, hook output duplicates, or commit/push/conflict needs guarding. Not for lost-commit recovery (use git-safety-net), GitHub ops (use github-ops), or history scrubbing (use github-sensitive-data-cleanup).

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4512026年10月11日 更新

Runs adversarial due-diligence on a benchmark the user envies — a founder, KOL, company, or product whose success looks inflated — splitting marketing bubble from real signal, then mapping the validated playbook onto the user's own resources. Use for 尽调/对标/拆解 a competitor, 抄/偷师 their playbook, or suspecting 水分/泡沫 in claims. Prefer over deep-research when debunking inflated claims, not a neutral briefing.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4512026年10月11日 更新

daymade のスキルをすべて見る

このスキルの問題を報告する