Video Optimizer — Reduce FPS, Resize & Compress (CCTV, AI) avatar

Video Optimizer — Reduce FPS, Resize & Compress (CCTV, AI)

Pricing

from $21.00 / 1,000 video minute optimizeds

Go to Apify Store
Video Optimizer — Reduce FPS, Resize & Compress (CCTV, AI)

Video Optimizer — Reduce FPS, Resize & Compress (CCTV, AI)

Shrink videos in bulk: lower FPS (30 to 5), downscale to 720p, compress to H.264 MP4 or fit under 16/25 MB. Presets for CCTV storage, AI inference, WhatsApp and e-mail. Removes GPS/device metadata. Pay per minute.

Pricing

from $21.00 / 1,000 video minute optimizeds

Rating

0.0

(0)

Developer

Leandro Zanatta

Leandro Zanatta

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Categories

Share

Video Optimizer — Reduce FPS, Resize & Compress Videos

Shrink videos in bulk with one API call: lower the frame rate (for example 30 → 5 fps), downscale to 720p, compress to H.264 MP4, or fit a target size such as 16 MB. Ready-made presets for CCTV / security camera storage, AI and computer vision inference, web, WhatsApp and e-mail. Container metadata (device model, creation time, GPS location) is removed by default.

Original 1080p video next to the CCTV preset output: same scene, 5.49 MB down to 0.31 MB

Real output of this Actor on a 13-second 1080p street clip (video: Qviri, CC BY-SA 4.0, Wikimedia Commons).

Why use it

  • 💾 Cut storage costs: security footage rarely needs 30 fps and 1080p. The CCTV preset typically removes 90–95% of the size while keeping people, vehicles and events clearly visible.
  • 🤖 Faster, cheaper AI pipelines: object detectors, OCR and video analytics usually process 1–5 frames per second. Sending them a 5 fps, 640p file cuts upload, decoding and GPU time.
  • 📤 Files that actually send: fit any clip under the 16 MB WhatsApp limit or the 25 MB e-mail attachment limit, automatically.
  • 🔒 Privacy by default: removes metadata such as the recording device, creation date and GPS coordinates before you share or archive a file.
  • 🧩 No servers, no FFmpeg setup: send URLs, get MP4 links back. Works from Python, JavaScript, Make, Zapier, n8n, webhooks and AI agents (MCP).

Who uses it

SectorTypical use
Security & CCTV integratorsArchive weeks of camera exports in a fraction of the space; send clips to clients and insurers
AI / computer vision teamsPre-process video before detection, tracking, OCR or labeling
Logistics, fleets, dashcamsShrink driver and yard footage for upload over mobile networks
Real estate, construction, dronesLighter inspection and site-progress videos for reports and portals
Education & e-learning720p versions of lectures for LMS platforms with upload limits
Support & customer serviceMake customer-sent videos small enough for ticket systems and e-mail
Marketing & social mediaBatch-convert raw footage (MOV, WebM, HEVC) into web-friendly MP4

Presets

Measured on the 13-second, 1920×1080, 30 fps, 5.49 MB clip shown above:

PresetWhat it doesResultBest for
CCTV storage (default)5 fps, max 720p, CRF 30, no audio0.31 MB (−94%)Archiving security-camera footage
AI inference5 fps, max 640p, CRF 23, no audio0.87 MB (−84%)Detection, tracking, OCR, video analytics
Web 720pMax 720p, CRF 23, original fps and audio1.37 MB (−75%)Websites, LMS, internal portals
Fit in 16 MB (WhatsApp)Max 720p, guaranteed under 16 MB1.37 MB (−75%)WhatsApp, Telegram, chat apps
Fit in 25 MB (e-mail)Max 720p, guaranteed under 25 MB1.37 MB (−75%)E-mail attachments
CustomOnly what you set—Anything else

How the size presets work: the video is first encoded at good quality with a bitrate cap. If it already fits, you get that file (a small video is never inflated to fill the limit). If it doesn't, the Actor runs a two-pass encode that lands just under the limit. If the video is simply too long for the limit, the run says so clearly instead of returning an unwatchable file; raise the size or set Max minutes per video.

Any field you fill in overrides the preset, so CCTV storage + Target FPS 10 gives 10 fps with the rest of the preset.

Input

FieldTypeDescription
Video URLs (videoUrls)arrayDirect links to videos. Public Google Drive and Dropbox share links are converted automatically. Up to 4 GB per file.
Preset (preset)stringcctv-storage, ai-inference, web-720p, whatsapp-16mb, email-25mb or custom
Target FPS (targetFps)integerNew frame rate. Never increases the original.
Max height (maxHeight)integerDownscale anything taller, keeping the aspect ratio. Never upscales.
Quality (CRF) (crf)integer18 = near lossless, 23 = good, 28–32 = small files
Target file size (MB) (targetSizeMB)integerKeep each output under this size
Remove audio (removeAudio)booleanDrop the audio track
Remove metadata (stripMetadata)booleanRemove device, creation time and GPS (default: on)
Max minutes per video (maxDurationMinutes)integerOnly the first N minutes are processed and billed (default 120)

Example:

{
"videoUrls": [
"https://example.com/camera-01.mp4",
"https://drive.google.com/file/d/FILE_ID/view?usp=sharing"
],
"preset": "cctv-storage",
"targetFps": 3
}

Supported inputs: MP4, MOV, WebM, MKV, AVI, FLV, MPEG-TS and others; codecs H.264, H.265/HEVC, VP8, VP9, AV1, MPEG-4. Output is always H.264 MP4 with fast-start, which plays in every browser, phone and video player.

Output

One dataset row per video. The optimized file is stored in the run's key-value store and linked in outputUrl.

{
"sourceUrl": "https://example.com/camera-01.mp4",
"preset": "cctv-storage",
"outputUrl": "https://api.apify.com/v2/key-value-stores/.../records/optimized-0001.mp4",
"input": { "durationSeconds": 13.07, "sizeMB": 5.49, "width": 1920, "height": 1080, "fps": 29.83, "videoCodec": "vp9", "audioCodec": "opus" },
"output": { "durationSeconds": 13.0, "sizeMB": 0.31, "width": 1280, "height": 720, "fps": 5.0, "videoCodec": "h264", "audioCodec": null },
"sizeReductionPercent": 94.3,
"truncated": false,
"billedMinutes": 1
}
FieldMeaning
outputUrlDownload link of the optimized MP4
input / outputDuration, size, resolution, fps and codecs before and after
sizeReductionPercentHow much smaller the output is
truncatedtrue when only the first Max minutes per video were processed
billedMinutesStarted minutes billed for this video
errorPresent only when a video failed (failed videos are free)

Export the table as JSON, CSV or Excel, or read it through the API.

Pricing

Pay per started minute of video processed, plus a tiny per-run start fee. No subscription. Failed videos are free. Apify plan discounts apply automatically (see the Pricing tab).

ExampleMinutes billed
13-second clip1
10 clips of 30 seconds10
1 hour of CCTV footage60

Use Max minutes per video or the run's maximum cost setting to cap spending; the Actor stops cleanly when the limit is reached.

Use it from code or an AI agent

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("adorable_partial/video-optimizer").call(
run_input={"videoUrls": ["https://example.com/camera-01.mp4"], "preset": "ai-inference"}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["outputUrl"], item["sizeReductionPercent"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('adorable_partial/video-optimizer').call({
videoUrls: ['https://example.com/clip.mov'],
preset: 'whatsapp-16mb',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].outputUrl);

HTTP (one request, waits for the result)

curl -X POST "https://api.apify.com/v2/acts/adorable_partial~video-optimizer/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"videoUrls": ["https://example.com/camera-01.mp4"], "preset": "cctv-storage"}'

No-code and agents: use the Apify modules in Make, Zapier or n8n, trigger runs from webhooks or schedules (e.g. every night on new camera exports), or let an AI agent call it through the Apify MCP server.

FAQ

Will the video look worse? Lower fps and resolution are visible by design: the CCTV and AI presets trade smoothness for size, while people, vehicles and events stay clear. "Web 720p" keeps the original motion and good quality. For near-original quality use Custom with CRF 18–20.

Can it make a video bigger or upscale it? No. Resolution and fps are only ever reduced, and the size presets never inflate a file that already fits.

How long can videos be? Files up to 4 GB. Long recordings are processed in full unless you set Max minutes per video (default 120).

How fast is it? Roughly real-time or faster for 1080p input with the default 4 GB memory. More memory gives more CPU and faster runs.

Does it remove GPS and device information? Yes, container metadata is removed by default (stripMetadata). It does not blur faces or license plates; for that, see the related Actor below.

Is my video kept? Files are processed inside your run and stored only in your own Apify storage, which follows your account's data-retention settings. Nothing is shared with third parties.

Private files? Use direct download links (for example S3 / GCS pre-signed URLs) or public share links from Google Drive or Dropbox.

Support

Found a bug or need a preset for your workflow? Open an issue in the Issues tab and it will be answered there.