Wjs Reframing Video

SKILL内容创作
内容创作 未标注权限 许可证不明确

Use when the user wants to convert a video between horizontal and vertical orientations while preserving the inverted aspect ratio (16:9 ↔ 9:16, 4:3 ↔ 3:4, 21:9 ↔ 9:21). The skill crops a narrow band from the source and tracks the active speaker — the person whose mouth is moving — via MediaPipe face landmarks and mouth-aspect-ratio variance, so the talker stays in frame even when other people are visible. Triggers — "横转竖", "竖转横", "做成竖屏发抖音/视频号/小红书", "16:9 to 9:16", "make this vertical for Reels / TikTok / YouTube Shorts", "crop to portrait", "convert to landscape".

一句话选型结论

按资料字段整理

Wjs Reframing Video是内容创作类的 Agent Skill,安装方式:GitHub 仓库,权限级别未标注,许可证不明确,没有现成安装命令,需按说明手动放置 SKILL.md。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类内容创作 安装方式GitHub 仓库 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 claude-skills
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

GitHub 仓库
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    按安装说明或仓库 README,把 SKILL.md 放到客户端的 skills 目录(一般一个技能一个文件夹)。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

内容创作
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方jianshuo仓库 claude-skills · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式GitHub 仓库安装包 jianshuo/claude-skills
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 2026-05-24
正文体量12.0 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
写文章与脚本

按主题产出初稿与分镜脚本。

改稿与润色

把草稿改顺、统一语气。

多平台文案改写

同一内容按平台改成长短不同的版本。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 基础信息齐全,可以先按说明装一个试试。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有现成安装命令,要按安装说明或仓库 README 手动放置。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在内容创作场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
Wjs Reframing Video当前 未标注权限 GitHub 仓库 未标注 未标注 无
AI 视频生成 调用外部服务 GitHub 仓库 431.3 万 Codex、Claude、Cursor 有
视频帧 联网访问 ClawHub 市场 262.1 万 OpenClaw 有
Markdown 转换器 写入文件 ClawHub 市场 135.3 万 OpenClaw 有
哔哩哔哩全合一 接触敏感数据 ClawHub 市场 64.1 万 OpenClaw 有
Remotion video toolkit 命令行 浏览器控制 ClawHub 市场 63.9 万 OpenClaw 有

SKILL.md 全文

12.0 KB
模型实际读到的说明书原文,来自技能仓库

wjs-reframing-video

Convert a video's orientation by cropping a narrow band from the source — not by physically rotating it. The crop window follows the active speaker (the face whose mouth is moving), not just the largest or most-confident face. A .crop.json sidecar records the crop plan, the per-segment speaker decisions, and the parameters used. The original input is never modified.

When to use

  • Repurposing a 16:9 podcast / interview / talk for vertical short-video platforms (WeChat Channels 视频号, Douyin 抖音, Xiaohongshu 小红书, YouTube Shorts, TikTok, Reels).
  • Repurposing a 9:16 phone recording for horizontal players (YouTube long-form, blog embeds).
  • Repurposing 4:3 archive footage for 3:4 mobile, or vice versa.

The output aspect is the source aspect with width and height swapped — 16:9 → 9:16, not "letterboxed 16:9 in a 9:16 frame".

When NOT to use

  • Multi-person Q&A where each face needs its own crop — this skill picks one crop track per video. For per-speaker split renders, use wjs-editing-multicam instead.
  • Animated content / B-roll with no faces — falls back to center crop, usually wrong for the intent.
  • Heavy camera motion in the source (handheld pan/zoom) — the face tracker amplifies camera shake. Stabilize first.
  • Source already at target aspect — no work to do.

What this skill IS — and IS NOT

Is Is not
Visual active-speaker detection via MAR (mouth-aspect-ratio) variance Audio-visual fusion (audio energy + lip motion cross-correlated)
Stable face tracking across frames by center-distance matching Re-identification across long gaps / occlusions
Speaker-aligned segments with hysteresis to prevent flicker Frame-by-frame switching on every flicker
--face-pick speaker (default) — pick whoever's mouth is moving --face-pick largest (opt-in legacy) — pick largest face
Hard cuts between segments, fixed crop within each segment (--motion cut, default) Smooth panning that drifts during a speaker's turn (opt-in --motion smooth)
Audio stream-copy (bit-exact) Audio reprocessing / re-encoding
MediaPipe Tasks FaceLandmarker (478-pt mesh) at 5 fps sampled via ffmpeg Per-frame neural inpainting / out-painting
One ffmpeg crop + scale pass Frame-by-frame Python compositor

Falls back to "largest face" automatically when no one is talking (silence, music-only stretches).

Dependencies

pip install mediapipe opencv-python numpy

(MediaPipe lives outside the standard Python distribution; ffmpeg and ffprobe must be on PATH.)

First-run model download: MediaPipe 0.10+ uses the Tasks API, which needs a face_landmarker.task model file (~4 MB). On the first call, crop.py downloads it to ~/.claude/skills/wjs-reframing-video/models/ and caches it for subsequent runs. The script fails offline on first run.

Range limitation: The bundled landmarker is tuned for faces within ~2 m of the camera (selfie / podcast / interview distance). Wide event shots with small faces may not detect — sample a frame first to confirm.

Crop math

Source aspect = W / H. Target aspect = H / W (inverted). Compute crop window:

Source orientation Crop window
Horizontal (W > H) → Portrait W_crop = H × H / W, H_crop = H (narrow vertical band)
Portrait (W < H) → Horizontal W_crop = W, H_crop = W × W / H (narrow horizontal band)

For 1920×1080 → portrait, W_crop = 608, H_crop = 1080. Final scale to 1080×1920 (upscale ~1.78×).
For 1080×1920 → landscape, W_crop = 1080, H_crop = 608. Final scale to 1920×1080.

Override the final size via --output-size 1080x1920 if you want native crop dimensions instead of upscaling.

Pipeline

  1. Probe input dimensions, fps, duration via ffprobe.
  2. Decide orientation — auto from aspect (--target portrait|landscape to override).
  3. Sample frames at --sample-fps (default 5; high enough to catch mouth motion — Nyquist for speech is ~10 Hz, we need at least 4–5 fps).
  4. Detect face landmarks per sampled frame with MediaPipe Tasks FaceLandmarker (478 landmarks). For each detected face record: center, size proxy, MAR (mouth-aspect-ratio = inner-lip vertical distance / horizontal mouth-corner distance).
  5. Track faces across frames by center-distance matching → each face gets a stable face_id.
  6. Per-sample active speaker: for each face track, variance of MAR over a sliding window (--mar-var-window-sec, default 1 s). The face with the highest variance is "speaking". Below --mar-var-threshold, no one is speaking → fall back to largest face.
  7. Hysteresis: a candidate switch only commits if the new speaker is stable for --min-segment-sec (default 1.5 s). Shorter flickers are squashed — prevents the crop from ping-ponging on a one-frame mis-detection.
  8. Speaker-aligned segments → for each segment, mean (cx, cy) of that speaker's face over the segment becomes the crop center, fixed for the full duration of the segment.
  9. Build a ffmpeg step-function expression (--motion cut, default) that holds each segment's crop position constant and jumps instantly at each segment boundary — the visual feel of a real cut between camera angles. (--motion smooth switches to piecewise-linear pan between segment midpoints; rarely the right call for talking-head content because the camera appears to drift mid-sentence.)
  10. Render one ffmpeg pass — crop=W:H:x=&#x27;expr&#x27;:y=&#x27;expr&#x27;, scale=OUT_W:OUT_H. The crop filter evaluates x and y per frame natively. Audio stream-copied.

scripts/crop.py is the implementation. Output side effects:
- &lt;input&gt;.crop.json — sidecar with the crop plan
- &lt;input&gt;_cropped.mp4 — final cropped + scaled video

Sidecar schema (&lt;input&gt;.crop.json)

{
  &quot;_about&quot;: &quot;wjs-reframing-video crop plan for cam_a.MOV. Active-speaker detected via MAR variance.&quot;,
  &quot;_help&quot;: {
    &quot;source_size&quot;:     &quot;[width, height] in pixels.&quot;,
    &quot;target_size&quot;:     &quot;[width, height] of the final rendered output.&quot;,
    &quot;crop_window&quot;:     &quot;[width, height] of the moving crop in source coords.&quot;,
    &quot;chunks&quot;:          &quot;Speaker-aligned segments: {t0, t1, cx, cy, speaker_id}.&quot;,
    &quot;face_pick_mode&quot;:  &quot;speaker = MAR-variance active-speaker; largest = old behavior.&quot;,
    &quot;speaker_id&quot;:      &quot;Stable face track id. null means no face / silence fallback.&quot;
  },
  &quot;schema_version&quot;: 2,
  &quot;source&quot;: &quot;cam_a.MOV&quot;,
  &quot;source_size&quot;: [1920, 1080],
  &quot;target&quot;: &quot;portrait&quot;,
  &quot;target_size&quot;: [1080, 1920],
  &quot;crop_window&quot;: [608, 1080],
  &quot;face_pick_mode&quot;: &quot;speaker&quot;,
  &quot;sample_fps&quot;: 5.0,
  &quot;mar_var_window_sec&quot;: 1.0,
  &quot;mar_var_threshold&quot;: 1.5e-4,
  &quot;min_segment_sec&quot;: 1.5,
  &quot;chunks&quot;: [
    {&quot;t0&quot;:  0.0, &quot;t1&quot;:  4.2, &quot;cx&quot;: 808, &quot;cy&quot;: 540, &quot;speaker_id&quot;: 0},
    {&quot;t0&quot;:  4.2, &quot;t1&quot;: 11.6, &quot;cx&quot;: 1182, &quot;cy&quot;: 540, &quot;speaker_id&quot;: 1},
    {&quot;t0&quot;: 11.6, &quot;t1&quot;: 14.0, &quot;cx&quot;: 808, &quot;cy&quot;: 540, &quot;speaker_id&quot;: 0}
  ],
  &quot;face_sample_count&quot;: 1234,
  &quot;track_count&quot;: 2
}

Performance

  • Detection is the slow step. On Apple Silicon at 2 fps sampling, expect ~10–20× realtime (a 30-min source detects in ~1–2 min). Bumping --sample-fps makes detection slower but tracking more responsive.
  • Render is fast — single ffmpeg pass with hardware encode (hevc_videotoolbox on macOS). Often <1× realtime for a 1080p source.
  • For very long sources (>200 chunks), the ffmpeg expression gets cumbersome; the script auto-downsamples chunk midpoints to keep the expression under ~200 control points.

Common pitfalls

  • Mouth gestures aren't speech — a yawn, laugh, eating, or sucking-in-air all raise MAR variance. The detector can briefly mistake these for talking. For high-stakes content, eyeball the speaker timeline in the sidecar (the script prints a face#N: Xs on screen (Y%) summary) and re-run with a different --mar-var-threshold if needed.
  • Side-profile or down-tilted faces — when a face is rotated >60° from camera, MediaPipe may fail to land mouth landmarks reliably, so MAR variance flatlines. The speaker fallback to "largest face" kicks in. If you have a long stretch of profile shots, consider --face-pick largest.
  • Two faces with overlapping speech (interruption / talking over) — both faces have MAR variance, only one wins. The losing face is treated as listener. For accurate per-speaker tracking under crosstalk, use wjs-editing-multicam with separate cams.
  • Long stretches of silence (B-roll, music) — falls back to largest face. If the largest face is wrong (e.g. a listener stays still while the speaker's mic feeds music), you'll see drift. Pre-segment around music-only sections.
  • Source has burned-in lower-thirds / subtitles — for H→V, the lower band gets cropped out; for V→H, it stays but gets stretched. Strip burn-ins before running.
  • Wide-angle / fish-eye lenses — landmarks miss faces near edges. Pre-correct distortion with ffmpeg lenscorrection first.
  • Upscaling artifacts — 608×1080 → 1080×1920 is a 1.78× upscale and visible on sharp text. Render at native crop dims (--output-size 608x1080) and let the platform upscale, if you have overlays you want to keep sharp.
  • Output bitrate > platform limit — default is --bitrate 12M. WeChat Channels (视频号) caps at 10 Mbps; pass --bitrate 8M for that target.

Zero-detection fallback: deterministic fixed crop

The "may not detect" range limit isn't just a warning — when MediaPipe
detects 0 faces (far/static two-person interview, ~2 m+ from a wide
lens), the crop log reads 0 face observations across N sampled frames
and the script center-crops the frame — which on an interview set
lands the window on the background between the two people (a fireplace,
a plant, a logo), not on anyone. The output looks broken and no
--mar-var-threshold tuning helps, because there are no landmarks at all.

Always read the crop log before trusting the output. If it says
0 face track(s) identified / (no face / fallback): … 100%, abandon
the MediaPipe crop and do a deterministic fixed crop instead. The
camera on these shoots is static and the speakers sit at fixed screen
positions, so a hand-set X offset is rock-solid:

# 1920×1080 → 9:16 ⇒ crop window 608×1080. X = speaker&#x27;s screen position:
#   left speaker  → x=0      right speaker → x=1920-608=1312      centred → x=656
# Do crop + (HLG→SDR tone-map) + 30fps + dense keyframes in ONE pass so the
# body clip is final and HyperFrames can seek it (see /wjs-overlaying-video).
ZF=~/Library/Python/3.9/.../imageio_ffmpeg/binaries/ffmpeg-macos-aarch64-v7.1
&quot;$ZF&quot; -i clip.mp4 -vf \
  &quot;crop=608:1080:0:0,zscale=t=linear:npl=203,format=gbrpf32le,\
tonemap=tonemap=hable:desat=0,\
zscale=w=1080:h=1920:t=bt709:m=bt709:p=bt709:r=tv,format=yuv420p,fps=30&quot; \
  -c:v libx264 -crf 19 -preset medium -g 30 -keyint_min 30 \
  -color_primaries bt709 -color_trc bt709 -colorspace bt709 \
  -c:a aac -b:a 192k -movflags +faststart clip_vert.mp4

Verify by extracting a frame (-ss 20 -frames:v 1) and confirming the
speaker is centred before committing. For clips that genuinely need to
follow both speakers (heavy back-and-forth), hand-label per-speaker
windows from the transcript and concatenate fixed crops; for a clip that
is one person's monologue, a single fixed X is enough. Drop the
tonemap filters if the source is already SDR (bt709) — applying the HLG
recipe to SDR mis-colors it.

常见问题

5 问
答案由本站依据条目字段整理
Wjs Reframing Video怎么安装?

没有现成安装命令:按安装说明或仓库 README,把 SKILL.md 放进客户端的 skills 目录(一般一个技能一个文件夹)。

Wjs Reframing Video支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

Wjs Reframing Video权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

Wjs Reframing Video收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

Wjs Reframing Video用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。