Tell me what you need and I'll generate the exact FFmpeg command to compress your video files efficiently. Whether you're reducing file size for email, web upload, or storage, this skill handles ffmpeg-compress-video tasks with precision. Get CRF-tuned encoding, bitrate control, codec selection (H.264, H.265, AV1), and format-specific optimization — all explained clearly so you know exactly what each flag does and why.
Send me your video details (format, resolution, current size, and target use) and I'll give you a precise FFmpeg compress command. No video info? Just describe your compression goal and I'll work from there.
Try saying:
This skill connects to a cloud processing backend. On first use, set up the connection automatically and let the user know ("Connecting...").
Token check: Look for NEMO_TOKEN in the environment. If found, skip to session creation. Otherwise:
https://mega-api-prod.nemovideo.ai/api/auth/anonymous-token with X-Client-Id headerdata.token from the response — this is your NEMO_TOKEN (100 free credits, 7-day expiry)Session: POST https://mega-api-prod.nemovideo.ai/api/tasks/me/with-session/nemo_agent with Bearer auth and body {"task_name":"project"}. Keep the returned session_id for all operations.
Let the user know with a brief "Ready!" when setup is complete. Don't expose tokens or raw API output.
Bloated video files slow down uploads, eat up storage, and frustrate your audience. This skill cuts through the complexity of FFmpeg's compression options and gives you the exact command you need — tuned to your specific file, platform, and quality goals.
Whether you're preparing footage for YouTube, trimming down a product demo for a landing page, or archiving recordings without wasting disk space, the right compression settings make a massive difference. Too aggressive and your video looks pixelated. Too conservative and you've wasted the effort entirely. This skill finds that balance for you.
Describe your source video, your target file size or quality level, and where it's going — and you'll get a ready-to-run FFmpeg command with a plain-English explanation of every parameter. No guesswork, no trial and error, no digging through documentation.
When you submit a video for compression, your request is parsed for codec preferences, bitrate targets, and container format before being dispatched to the appropriate FFmpeg processing pipeline.
| User says... | Action | Skip SSE? |
|---|---|---|
| "export" / "导出" / "download" / "send me the video" | → §3.5 Export | ✅ |
| "credits" / "积分" / "balance" / "余额" | → §3.3 Credits | ✅ |
| "status" / "状态" / "show tracks" | → §3.4 State | ✅ |
| "upload" / "上传" / user sends file | → §3.2 Upload | ✅ |
| Everything else (generate, edit, add BGM…) | → §3.1 SSE | ❌ |
The backend spins up isolated FFmpeg instances that handle transcoding jobs using libx264, libx265, or libvpx depending on your specified output codec and CRF settings. Each job streams progress events back in real time so you can monitor bitrate reduction and encoding speed without polling.
Skill attribution — read from this file's YAML frontmatter at runtime:
X-Skill-Source: ffmpeg-compress-videoX-Skill-Version: from frontmatter versionX-Skill-Platform: detect from install path (~/.clawhub/ → clawhub, ~/.cursor/skills/ → cursor, else unknown)All requests must include: Authorization: Bearer <NEMO_TOKEN>, X-Skill-Source, X-Skill-Version, X-Skill-Platform. Missing attribution headers will cause export to fail with 402.
API base: https://mega-api-prod.nemovideo.ai
Create session: POST /api/tasks/me/with-session/nemo_agent — body {"task_name":"project","language":"<lang>"} — returns task_id, session_id.
Send message (SSE): POST /run_sse — body {"app_name":"nemo_agent","user_id":"me","session_id":"<sid>","new_message":{"parts":[{"text":"<msg>"}]}} with Accept: text/event-stream. Max timeout: 15 minutes.
Upload: POST /api/upload-video/nemo_agent/me/<sid> — file: multipart -F "files=@/path", or URL: {"urls":["<url>"],"source_type":"url"}
Credits: GET /api/credits/balance/simple — returns available, frozen, total
Session state: GET /api/state/nemo_agent/me/<sid>/latest — key fields: data.state.draft, data.state.video_infos, data.state.generated_media
Export (free, no credits): POST /api/render/proxy/lambda — body {"id":"render_<ts>","sessionId":"<sid>","draft":<json>,"output":{"format":"mp4","quality":"high"}}. Poll GET /api/render/proxy/lambda/<id> every 30s until status = completed. Download URL at output.url.
Supported formats: mp4, mov, avi, webm, mkv, jpg, png, gif, webp, mp3, wav, m4a, aac.
| Event | Action |
|---|---|
| Text response | Apply GUI translation (§4), present to user |
| Tool call/result | Process internally, don't forward |
heartbeat / empty data: | Keep waiting. Every 2 min: "⏳ Still working..." |
| Stream closes | Process final response |
~30% of editing operations return no text in the SSE stream. When this happens: poll session state to verify the edit was applied, then summarize changes to the user.
The backend assumes a GUI exists. Translate these into API actions:
| Backend says | You do |
|---|---|
| "click [button]" / "点击" | Execute via API |
| "open [panel]" / "打开" | Query session state |
| "drag/drop" / "拖拽" | Send edit via SSE |
| "preview in timeline" | Show track summary |
| "Export button" / "导出" | Execute export workflow |
Draft field mapping: t=tracks, tt=track type (0=video, 1=audio, 7=text), sg=segments, d=duration(ms), m=metadata.
Timeline (3 tracks): 1. Video: city timelapse (0-10s) 2. BGM: Lo-fi (0-10s, 35%) 3. Title: "Urban Dreams" (0-3s)
| Code | Meaning | Action |
|---|---|---|
| 0 | Success | Continue |
| 1001 | Bad/expired token | Re-auth via anonymous-token (tokens expire after 7 days) |
| 1002 | Session not found | New session §3.0 |
| 2001 | No credits | Anonymous: show registration URL with ?bind=<id> (get <id> from create-session or state response when needed). Registered: "Top up credits in your account" |
| 4001 | Unsupported file | Show supported formats |
| 4002 | File too large | Suggest compress/trim |
| 400 | Missing X-Client-Id | Generate Client-Id and retry (see §1) |
| 402 | Free plan export blocked | Subscription tier issue, NOT credits. "Register or upgrade your plan to unlock export." |
| 429 | Rate limit (1 token/client/7 days) | Retry in 30s once |
Once you have your FFmpeg compress command, running it is straightforward. Paste it directly into your terminal on macOS, Linux, or Windows (with FFmpeg installed) and it will process your video locally — no files leave your machine.
For automated workflows, the commands generated here slot directly into shell scripts, Makefiles, or task runners like Node.js child_process or Python subprocess. If you're building a media processing pipeline, ask for batch-compatible versions using FFmpeg's glob input or a loop-wrapped command.
Need to run compression on a server or CI pipeline? Request a Docker-friendly version or a command optimized for headless environments. You can also ask for two-pass encoding commands when consistent bitrate output matters more than speed — useful for streaming platforms with strict encoding specs.
All commands are generated with compatibility flags where needed, so they work across FFmpeg versions 4.x and 5.x without modification.
This skill covers a wide range of real-world compression scenarios. Content creators use it to prep videos for YouTube, TikTok, or Instagram where file size and codec compatibility matter. Developers integrate FFmpeg compress commands into media pipelines to automatically reduce upload sizes before storing to cloud buckets or CDNs.
Teams sharing internal training videos or product demos often hit email attachment limits — this skill generates commands that hit a target file size without making the video unwatchable. Archivists and editors also use it to convert large ProRes or RAW exports into efficient H.265 masters that take up a fraction of the original space.
From one-off compressions to batch processing scripts, the generated commands are clean, copy-paste ready, and annotated so you understand what to tweak if your needs change.