Skip to content
cccskills
FreePublished on GitHub

ecommerce-video-edit

Turn existing product or creator footage into vertical ads for TikTok, Reels, and Meta using FFmpeg. Reorder the strongest moment, add a text hook, captions, and a call to action, then export hook variants plus feed and cover formats.

OriginalShow the original description

Turn raw product footage into a TikTok ad with FFmpeg. Recuts creator, UGC or product footage into a 9:16 ecommerce ad for TikTok, TikTok Shop, Reels and Meta: the best moment moved to second 0, a text hook inside the safe zone, dead air cut, captions, a CTA end card, loudness at -14 LUFS, and one MP4 per hook for testing (plus a 4:5 feed cut and a cover frame). Every command was run on test media. Free and local; on the varg ffmpeg tool (credits) when the agent has no shell. Use when someone has footage of a product (a creator video, an unboxing, a demo, a winning ad) and wants it edited into an ad, wants new hooks on an existing ad, or wants it TikTok-ready. NOT for generating new footage (use product-photo-to-video or ai-ugc-ad-video), animated word-by-word captions (use a Remotion or HyperFrames caption skill), or generic crops and subtitles (use short-form-ffmpeg-cookbook).

hashgraph-online/awesome-codex-plugins1,440 stars(GitHub 1,440 + cccskills 0)
Works withTikTok

Run score Not tested

See how to install

Good for

  • Edit an unboxing into a TikTok ad
  • Add new hooks to an existing product video
  • Create ad variants to compare hooks
  • Prepare vertical and feed formats from footage

Files included (3)

  • SKILL.md10.1 KB
  • scripts/cut-dead-air.sh1.4 KB
  • scripts/hook-variants.sh1.0 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Turn raw product footage into a TikTok ad with FFmpeg

Input: footage of a product (a creator clip, an unboxing, a demo, last month's winning ad). Output: a 1080×1920 MP4 that opens on the product and the payoff, says the hook in text inside the safe zone, has no dead air, ends on one CTA, and plays at the loudness the apps expect. You also get one file per hook for testing, a 4:5 feed cut and a cover frame.

All commands were run on test media (FFmpeg 6.0 static and 8.1). Run one step at a time and look at a frame before going on.

0. Ask before cutting

  1. What is the one thing the viewer must see? The product doing its job, or the result. It goes in the first 1–2 seconds.
  2. Where does it run? TikTok Shop and organic content: 15–45 s. Paid TikTok and Meta: 15–30 s for cold traffic, up to 60 s for a story that holds. One video, many hooks, beats one video per idea.
  3. What claims are allowed? Only what the brand can prove. Edit out "cures", "guaranteed", fake prices and before/after shots on health or weight products.
  4. Sound: the creator's voice, licensed music (TikTok Commercial Music Library for ads), or both with ducking. Trending sounds from organic posts are not cleared for ads.

1. Probe

ffprobe -v error -show_entries stream=codec_type,codec_name,width,height,r_frame_rate -show_entries format=duration -of compact=p=0 input.mp4

Horizontal footage? Fit it to 9:16 over a blurred copy, so the whole product stays in the frame:

ffmpeg -i raw.mp4 -filter_complex "[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,boxblur=20:2[bg];[0:v]scale=1080:-2[fg];[bg][fg]overlay=(W-w)/2:(H-h)/2,setsar=1" -c:v libx264 -crf 20 -c:a copy vertical.mp4

For a centre crop instead, see short-form-ffmpeg-cookbook.

2. Find the hook moment and move it to second 0

Watch for the strongest 2–4 s: the product working, the reveal, the reaction, the before→after. If there is a transcript, the hook is often a line said 10–20 s in ("I stopped buying razors after this"). Move it to the front and keep the rest in order (here 12–15 s moves to the front):

ffmpeg -i input.mp4 -filter_complex "[0:v]trim=12:15,setpts=PTS-STARTPTS[v0];[0:a]atrim=12:15,asetpts=PTS-STARTPTS[a0];[0:v]trim=0:12,setpts=PTS-STARTPTS[v1];[0:a]atrim=0:12,asetpts=PTS-STARTPTS[a1];[0:v]trim=start=15,setpts=PTS-STARTPTS[v2];[0:a]atrim=start=15,asetpts=PTS-STARTPTS[a2];[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -crf 20 -c:a aac -b:a 192k recut.mp4

Then cut what came before the product shows up: "Hey guys", logos, slow intros. Nobody waits for them.

3. Cut dead air

scripts/cut-dead-air.sh finds pauses with silencedetect, keeps 0.12 s of air on each side, and joins the rest:

bash scripts/cut-dead-air.sh recut.mp4 tight.mp4 -35 0.5 0.12   # noise floor dB, min pause s, padding s
# Tested: "kept 4 segments: 16.28s of 20.00s"

Raise the noise floor (-30) for noisy rooms and lower it (-40) for quiet voices. Listen to the cuts: a breath cut mid-word means the padding is too small.

Pacing that still drags? Speed the body up a little (1.1–1.2× keeps the voice natural):

ffmpeg -i tight.mp4 -filter_complex "[0:v]setpts=PTS/1.15[v];[0:a]atempo=1.15[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 20 -c:a aac fast.mp4

4. Text hook in the first 3 seconds

Most people watch muted at first. Put the hook in words on screen, inside the safe zone: out of the top 14%, the bottom 35% and 6% at each side (the TikTok and Reels buttons, caption and username sit there). Keep it to two lines of at most about 24 characters each at 64 px:

printf 'I stopped buying razors\nafter I found this' > hook.txt
ffmpeg -i tight.mp4 -vf "drawtext=fontfile='/System/Library/Fonts/Supplemental/Arial Bold.ttf':textfile=hook.txt:fontcolor=white:fontsize=64:line_spacing=12:box=1:boxcolor=black@0.6:boxborderw=28:x=(w-text_w)/2:y=h*0.20:enable='between(t,0,3)'" -c:v libx264 -crf 20 -c:a copy texthook.mp4

Always pass fontfile (on Linux, e.g. /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf). Without it, static builds print a fontconfig error. Multi-line drawtext aligns lines to the left. For centred or animated type, render the hook as a PNG or in HyperFrames/Remotion and overlay it.

Captions for the rest of the video: burn an SRT or ASS file (see short-form-ffmpeg-cookbook §2) and keep them in the same safe band.

5. One CTA at the end

One action, said and shown: "Tap the orange cart" (TikTok Shop), "Shop now", or "Link in bio" (organic). Show it over the last 3 seconds:

D=$(ffprobe -v error -show_entries format=duration -of csv=p=0 texthook.mp4)
ffmpeg -i texthook.mp4 -vf "drawtext=fontfile='/System/Library/Fonts/Supplemental/Arial Bold.ttf':text='Tap the orange cart':fontcolor=black:fontsize=72:box=1:boxcolor=white@0.92:boxborderw=30:x=(w-text_w)/2:y=h*0.45:enable='gte(t,$D-3)'" -c:v libx264 -crf 20 -c:a copy cta.mp4

Don't add a price, a discount or "only today" unless the offer is real and live.

6. Many hooks, one body (the test set)

A hook is the first 2–3 s. Make 3–10 openers (new footage, a new line, a new text hook, a different first frame) and put each in front of the same body. scripts/hook-variants.sh scales every input to 1080×1920 at 30 fps and 48 kHz stereo, so clips from different sources join cleanly:

# hooks/h01-question.mp4, hooks/h02-pov.mp4, ...   body.mp4 = the ad without its old hook
bash scripts/hook-variants.sh body.mp4 hooks variants 2   # last arg: seconds to drop from the body's start (its old hook)
# → variants/h01-question__body.mp4, variants/h02-pov__body.mp4

Name files so the results can be read back later: <product>_<angle>_<hook-id>_<creator>_<length>_v<N>.mp4, e.g. serum_dryskin_h03-pov_maya_22s_v1.mp4. Change one thing per variant (the hook) so the test says which one won.

7. Loudness, export, check

Two-pass loudnorm to -14 LUFS integrated and -1 dBTP:

J=$(ffmpeg -hide_banner -i cta.mp4 -af loudnorm=I=-14:TP=-1:LRA=11:print_format=json -f null - 2>&1 | sed -n '/^{/,/^}/p')
v() { echo "$J" | grep "\"$1\"" | cut -d'"' -f4; }
ffmpeg -i cta.mp4 -af "loudnorm=I=-14:TP=-1:LRA=11:measured_I=$(v input_i):measured_TP=$(v input_tp):measured_LRA=$(v input_lra):measured_thresh=$(v input_thresh):offset=$(v target_offset):linear=true,aresample=48000" -c:v copy -c:a aac -b:a 192k loud.mp4
ffmpeg -hide_banner -i loud.mp4 -af ebur128 -f null - 2>&1 | grep -E "^\s+I:" | tail -1   # Tested: I: -14.0 and -13.9 LUFS on two inputs

Export (H.264 High, yuv420p, 30 fps, AAC 48 kHz, faststart), a 4:5 feed cut and a cover:

ffmpeg -i loud.mp4 -c:v libx264 -profile:v high -pix_fmt yuv420p -r 30 -b:v 8M -maxrate 10M -bufsize 16M -c:a aac -b:a 192k -ar 48000 -movflags +faststart final_9x16.mp4
ffmpeg -i final_9x16.mp4 -vf "crop=iw:iw*5/4:0:(ih-iw*5/4)*0.4,scale=1080:1350,setsar=1" -c:v libx264 -crf 20 -c:a copy final_4x5.mp4
ffmpeg -ss 0.5 -i final_9x16.mp4 -frames:v 1 -q:v 2 cover.jpg

Check the safe zone on a frame before delivering: the red bands must hold no text, no product and no face.

ffmpeg -ss 1 -i final_9x16.mp4 -frames:v 1 -vf "drawbox=x=0:y=0:w=iw:h=ih*0.14:color=red@0.35:t=fill,drawbox=x=0:y=ih*0.65:w=iw:h=ih*0.35:color=red@0.35:t=fill,drawbox=x=0:y=0:w=iw*0.06:h=ih:color=red@0.35:t=fill,drawbox=x=iw*0.94:y=0:w=iw*0.06:h=ih:color=red@0.35:t=fill" safezone.png

Edit checklist

  • The product or the result shows by second 2; no logo or greeting opens the video
  • The text hook is readable muted, two short lines, inside the safe zone
  • No pause longer than half a second; the pacing drops off nowhere
  • The claims are provable; no fake urgency; AI people or voices are labelled where the platform requires it
  • One CTA, said and shown
  • Integrated loudness -14 LUFS, peaks at -1 dBTP or lower
  • 1080×1920, 30 fps, H.264 yuv420p, faststart; a 4:5 cut for feed placements
  • Every hook variant in its own named file, the body unchanged

No shell? Run it on varg

Send the same command to the varg ffmpeg tool (MCP call_tool, or POST https://api.varg.ai/v2/ffmpeg). Inputs and outputs are URLs. It is priced in credits, with an estimate before anything runs.

Related skills

  • ecommerce-video-ads: the whole process, from angle to hooks, formats and testing
  • product-video-hooks: what to say and show in the first 3 seconds
  • ad-creative-testing: how many variants to make, what to change, when to kill an ad
  • short-form-ffmpeg-cookbook: crop, captions, trim and join, music ducking
  • varg-video-edit-library: 206 named edits (cuts, transitions, titles, end cards) for FFmpeg, HyperFrames, Remotion and CapCut

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Plan worthwhile local tasks by checking dependencies, effects, resources, and platform boundaries, then execute the exact approved plan. It can use safe parallel work or suitable Apple-silicon backends when the project exposes them.

  • Speed up independent local build or test steps
  • Plan a task with several dependency-linked operations
  • Choose an Apple-silicon backend for supported numerical or media work
hashgraph-online/awesome-codex-plugins1.4KUpdated Oct 27, 2026

Turn a winning TikTok or Meta ad into a structured creative test plan. Identify what made it work, plan distinct concepts, set test budgets and review timing, and use funnel metrics to decide whether to stop, iterate, or scale each ad.

  • Planning how many ad concepts to test and what budget to assign
  • Creating ad variants that differ in buyer, angle, format, or opening frame
  • Diagnosing why variants perform alike or where an ad loses viewers
hashgraph-online/awesome-codex-plugins1.4KUpdated Oct 30, 2026

add

FreeSummary

Record deferred engineering decisions and temporary workarounds in a debt registry, with context such as effort, ongoing cost, affected area, and payoff trigger. Entries receive short labels so they can be reviewed or dropped later.

  • Logging a TODO or unfinished implementation
  • Recording a temporary default or bypassed check
  • Tracking a swallowed error or loosened type
hashgraph-online/awesome-codex-plugins1.4KUpdated Oct 30, 2026

Generate or compare AI agent code for LangChain, EINO, AutoGen, AgentScope, and CrewAI using framework-specific templates, API mappings, conventions, and project structures. Reference files include verification dates to help identify potentially outdated guidance.

  • Creating an agent project for a chosen framework
  • Comparing APIs across supported agent frameworks
  • Referencing framework-specific tool and memory patterns
hashgraph-online/awesome-codex-plugins1.4KUpdated Oct 26, 2026

Investigate a reproducible bug, test failure, or unexpected page behavior, then make a narrowly scoped fix. The workflow calls for a regression test before changing code, verifies the fix, and reports remaining risks and evidence while avoiding unrelated refactoring or feature work.

  • Finding the cause of a failing test
  • Fixing an unexpected page or feature behavior
  • Adding a regression test before a minimal code change
hashgraph-online/awesome-codex-plugins1.4KUpdated Oct 30, 2026

Build an AI agent project through six collaborative stages, from requirements and architecture to tools, prompts, code generation, and verification. Start framework-independent, then generate a runnable project for frameworks such as LangChain, EINO, AutoGen, AgentScope, or CrewAI.

  • Designing an AI agent from a business need
  • Generating a runnable agent project
  • Planning tools, prompts, and orchestration
hashgraph-online/awesome-codex-plugins1.4KUpdated Oct 26, 2026

See all skills by hashgraph-online

Report a problem with this skill