רינדור סרטון פרומו מקומית

סרטון פרומו או הסבר אפשר לבנות כקוד ולרנדר מקומית, בלי עורך וידאו ובלי שירות בתשלום. אבל בעברית ובווינדוס יש מלכודות שמייצרות סרטון שחור או שקט בלי שום שגיאה. ה-Skill מלמד את Claude לבנות קומפוזיציה, לצלם אתר, להוסיף מוזיקה ולרנדר, ומפרט כל מלכודת שכבר נמצאה ואיך עוקפים אותה. זהו Skill ל-Claude: תיקייה עם קובץ SKILL.md, שנטענת אוטומטית כשהמשימה מתאימה לתיאור שבראש הקובץ. בניגוד לפרומפט שמדביקים בכל פעם מחדש, Skill מותקן פעם אחת וממשיך לעבוד לבד.

קוד ואיכות · וידאו · HyperFrames · פרומו · רינדור · עברית

מתי הוא נכנס לפעולה

---
name: video-render-local
description: "Produce a finished promo or explainer MP4 locally with HyperFrames, including Hebrew RTL compositions, site capture, music and rendering on Windows. Carries the confirmed silent-failure traps that produce a black or silent video. Use when making a product video, promo, explainer or motion graphic, or when a render fails or comes out black or silent."
---

# סרטון מוגמר, מקומית, על ווינדוס

הצטבר מהפקה אמיתית שהגיעה עד MP4. כל אזהרה כאן מתעדת כשל שקרה, לא כשל תיאורטי.

בווינדוס רוב התקלות הן ב-PATH, ב-`npx` ובבינאריים, והפתרונות מופיעים בהמשך.

## המלכודת שעולה הכי ביוקר

```html
<html lang="he" dir="rtl">
```

**מייצר וידאו שחור לגמרי.** התצוגה המקדימה תקינה, הסנאפשוט תקין, וה-MP4 ריק.

הכיוון עובר ל-CSS על שורש הקומפוזיציה:

```css
#root {
  direction: rtl;
}
```

הלינטר של HyperFrames תופס את זה (`html_dir_attribute_breaks_render`). **תמיד להריץ `npm run check` לפני `npm run render`**, רנדור לוקח דקות, בדיקה לוקחת שניות.

## סדר העבודה

```bash
npx hyperframes skills update product-launch-video
npx hyperframes init "videos/<name>" --non-interactive --example=blank
# BRIEF.md נכתב מיד אחרי init. לפני כן init מסרב לתיקייה לא ריקה
```

אחר כך: לכידה, סטוריבורד, קומפוזיציה, `check`, `render`.

## לכידת אתר כבד

לכידה של אתר PWA עם service worker **נכשלת בברירת המחדל**:

```
✗ Capture failed: Runtime.evaluate timed out
```

זה אותו שורש שמקריס חלוניות דפדפן מוטמעות: מטמון מקדים של עשרות קבצים ו-WASM.

```bash
npx hyperframes capture "<URL>" -o ./capture \
  --skip-vision --max-screenshots 8 \
  --timeout 240000 --capture-budget 300000
```

`--timeout` הוא לטעינת העמוד, `--capture-budget` הוא לכל מה שאחריה. שניהם צריכים הארכה.

## חוזה הקומפוזיציה

```html
<div id="root" data-composition-id="main" data-start="0"
     data-width="1080" data-height="1920" data-duration="87">
  <section class="clip" data-start="0" data-duration="6">…</section>
</div>
<script>
  const tl = gsap.timeline({ paused: true });
  tl.from("#x", { opacity: 0, duration: 0.6 }, 0.2);
  window.__timelines = window.__timelines || {};
  window.__timelines["main"] = tl;
</script>
```

- `data-start` הוא מה שהופך אלמנט לקליפ. `class="clip"` הוא מוסכמה לפריסה
- הטיימליין **חייב** להיות `paused` ורשום על `window.__timelines`
- **אין `Math.random` ואין `Date.now`.** רנדור חייב לתת אותם פיקסלים בכל הרצה. לפיזור אקראי למראית עין, פונקציה עם זרע:

```js
const seeded = (i, salt) => {
  const x = Math.sin(i * 12.9898 + salt * 78.233) * 43758.5453;
  return x - Math.floor(x);
};
```

## מה שהלינטר יתפוס, ומה לעשות

| ממצא | המשמעות |
|---|---|
| `html_dir_attribute_breaks_render` | וידאו שחור. חובה לתקן |
| `content_overlap` על טקסט | בדרך כלל טקסט קטן שממילא לא נקרא. **למחוק את הטקסט**, לא לעקוף עם `data-layout-allow-occlusion` |
| `duplicate_media_discovery_risk` | אותו `src` פעמיים. לתת לכל שימוש קובץ משלו |
| ניגודיות מתחת ל-4.5 | לרוב על טקסט זעיר. אותו פתרון: להסיר |

**טקסט מתחת ל-20 פיקסלים בפריים של 1080 אינו מידע, הוא רעש.** פס כתום נקרא כבאנר פרסומת בלי המילה "פרסומת".

## רנדור

```bash
export PATH="$PWD/node_modules/ffmpeg-static:$PWD/node_modules/ffprobe-static/bin/win32/x64:$PATH"
npm run render
```

**בחזית, לא ברקע.** רנדור ברקע איבד את ה-PATH, החזיר `exit 0`, לא ייצר קובץ, ובגוף הפלט היה `✗ Render failed`.

87 שניות ב-1080×1920 לקחו כשתי דקות על 22 ליבות. תנועה מתמשכת מכפילה את זה, כי פחות פריימים ניתנים למיחזור.

## אודיו: מה עובד ומה לא

**שני מנגנוני התחברות נפרדים, וזה מבלבל:**

| | |
|---|---|
| `hyperframes auth login` | כותב ל-`~/.heygen`. **לא פותח קטלוג מוזיקה** |
| `heygen` CLI | נדרש ל-BGM, SFX ו-TTS דרך `media-use`. **לא רץ על ווינדוס בכלל** |

דף ההתקנה של HeyGen: macOS ולינוקס בלבד, ולווינדוס ממליצים WSL. אל תשלח משתמש לא טכני להתקין WSL.

**`hyperframes tts` הוא Kokoro מקומי, ואין בו עברית.** השפות: אנגלית, ספרדית, צרפתית, הינדי, איטלקית, פורטוגזית, יפנית, סינית.

### מוזיקה שכן עובדת

הריפו `Vincentwei1021/video-shotcraft` מגיע עם **חמישה קובצי BGM** ברישיון Mixkit חופשי מסחרית:

```bash
git clone --depth 1 https://github.com/Vincentwei1021/video-shotcraft.git
ls video-shotcraft/assets/audio/bgm/
```

**לקרוא את `assets/audio/ATTRIBUTION.md` לפני שימוש מסחרי.** אחד מהחמישה מסומן שם כדורש אימות, ולשאר יש URL מקור מאומת. בסרטון שמוכר, לא לוקחים את זה שמסומן.

לריפו הזה **אין TTS בכלל**. הוא פותר מוזיקה, לא קריינות.

### להשתיל אודיו

לא בקומפוזיציה אלא אחרי הרנדור. פשוט יותר ונותן שליטה מדויקת בפייד:

```bash
ffmpeg -i video.mp4 -i bgm.mp3 \
  -filter_complex "[1:a]atrim=0:87,afade=t=in:st=0:d=1.5,afade=t=out:st=83:d=4,volume=0.72[a]" \
  -map 0:v -map "[a]" -c:v copy -c:a aac -b:a 192k -shortest out.mp4
```

`-c:v copy` לא מקודד וידאו מחדש, ולכן זה לוקח שניות. עם קריינות, המוזיקה יורדת ל-`volume=0.25` בערך.

## סרטון שקט חייב תנועה מתמשכת

בלי קול, **פריים קפוא נקרא כתקלה**. כל סצנה סטטית מקבלת סחיפה איטית שממשיכה אחרי שהאנימציה הראשית נגמרה:

```js
tl.to("#grid", { scale: 1.06, duration: 8, ease: "none" }, 36);
tl.to("#mascot", { y: -22, duration: 8, ease: "sine.inOut" }, 79);
```

איטי מכדי לשים לב, מספיק כדי שהעין לא תעזוב.

## לאמת את התוצר, לא את הפלט

הרנדור מדווח הצלחה גם כשהתוכן שגוי. תמיד להסתכל:

```bash
ffprobe -v error -show_entries stream=codec_type,codec_name,duration \
  -of csv=p=0 out.mp4

# גיליון מגע מכל הסצנות
ffmpeg -i out.mp4 -vf "select='eq(n\,90)+eq(n\,600)+eq(n\,1200)',\
  scale=300:-1,tile=3x1" -frames:v 1 contact.png -y

# רמות שמע, כולל אימות שהפייד עובד
for t in 0 40 86; do ffmpeg -ss $t -t 1 -i out.mp4 -af volumedetect \
  -vn -f null - 2>&1 | grep mean_volume; done
```

**ואז לפתוח את `contact.png` ולהסתכל.** כך התגלה שסצנה הראתה את דף הבית של המוצר במקום את הפלט שהכלי באמת מייצר, וזה היה שקר בסרטון שיווקי.

## דיוק לפני יופי

בסרטון שמוכר מוצר, כל טענה נבדקת מול הקוד לפני שהיא נכנסת:

- מספר כלים ← קובץ הנתונים
- מהירויות והגדרות ← הקוד עצמו
- מסלולי מנוי ← קובץ המחירים
- שם תכונה ← הממשק עצמו

סצנה שהראתה "עונים על שאלות ומקבלים אתר" הייתה שקר: הכלי מייצר **פרומפט**, ומי שבונה את האתר הוא כלי אחר. התיקון גם דייק וגם הסביר טוב יותר.

בקופי עברי: **בלי מקף ארוך.** `grep` לפני מסירה.

איך מתקינים

  1. צרו תיקייה בשם video-render-local בתוך ‎.claude/skills/‎ בפרויקט, או בתיקיית הבית לשימוש בכל הפרויקטים.
  2. שמרו בתוכה את הקובץ בשם SKILL.md.
  3. זהו. אין צורך להפעיל כלום, והוא ייטען לבד כשהמשימה תתאים לתיאור.