Posters, storyboards, GIFs. From any frame you choose.
Every video needs a picture before it plays. Pick one frame, a grid of them or a few seconds as a GIF.
Who uses it: Video libraries, players, feeds, chat apps and anyone showing video in a list.
01
Thumbnails
Picks the most representative frame from the start of a video and saves it as an image.
- What it is for
- Posters for players, cards in a feed, previews in a library.
- Endpoint and fields
POST /v1/thumbnailsresize- In ffmpeg
thumbnailscale-frames:v 1
curl "$VIDEXO_API_URL/v1/thumbnails" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "poster.jpg",
"resize": {
"width": 640
}
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.thumbnails({
"input": "https://example.com/talk.mp4",
"filename": "poster.jpg",
"resize": {
"width": 640
}
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/thumbnails`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "poster.jpg",
"resize": {
"width": 640
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf thumbnail=300,scale=640:7680:force_original_aspect_ratio=decrease:force_divisible_by=2 \
-frames:v 1 -q:v 2 \
poster.jpg Output. poster.jpg: one JPEG, 640 pixels wide, the frame most like the rest of the first 300; "at": 10 takes the frame at 10 s instead.
02
Storyboards and contact sheets
Takes a frame at a fixed interval and lays the frames out in a grid on one image.
- What it is for
- Scrubbing previews, review sheets for editors, a whole video at a glance.
- Endpoint and fields
POST /v1/storyboardintervalcolumnsrowstile_width- In ffmpeg
fpsscaletile
curl "$VIDEXO_API_URL/v1/storyboard" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "storyboard.jpg",
"interval": 10,
"columns": 5,
"rows": 4,
"tile_width": 320
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.storyboard({
"input": "https://example.com/talk.mp4",
"filename": "storyboard.jpg",
"interval": 10,
"columns": 5,
"rows": 4,
"tile_width": 320
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/storyboard`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "storyboard.jpg",
"interval": 10,
"columns": 5,
"rows": 4,
"tile_width": 320
}),
});
const job = await response.json(); ffmpeg \
-skip_frame nokey -t 200 -i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf fps=1/10,scale=320:320:force_original_aspect_ratio=decrease:force_divisible_by=2,tile=5x4 \
-frames:v 1 -q:v 5 \
storyboard.jpg Output. storyboard.jpg: a key frame about every 10 seconds, up to 20 of them, in a grid 5 across and 4 down; exact_times takes the exact times.
03
GIF previews
Turns a few seconds of video into an animated GIF with a palette made for those frames.
- What it is for
- Previews that play anywhere an image can go: chats, emails, README files.
- Endpoint and fields
POST /v1/giftrimfpsresize- In ffmpeg
fpsscalepalettegenpaletteuse
curl "$VIDEXO_API_URL/v1/gif" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "preview.gif",
"trim": {
"start": 5,
"duration": 4
},
"fps": 12,
"resize": {
"width": 480
}
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.gif({
"input": "https://example.com/talk.mp4",
"filename": "preview.gif",
"trim": {
"start": 5,
"duration": 4
},
"fps": 12,
"resize": {
"width": 480
}
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/gif`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "preview.gif",
"trim": {
"start": 5,
"duration": 4
},
"fps": 12,
"resize": {
"width": 480
}
}),
});
const job = await response.json(); ffmpeg \
-ss 5 -t 4 -i https://example.com/talk.mp4 \
-filter_complex "[0:v:0]scale=480:7680:force_original_aspect_ratio=decrease:force_divisible_by=2:flags=lanczos,fps=12[o0s0];[o0s0]split[o0g0][o0g1];[o0g0]palettegen=max_colors=256[o0p];[o0g1][o0p]paletteuse[o0v]" \
-map "[o0v]" \
preview.gif Output. preview.gif: 4 seconds from 0:05, 480 pixels wide at 12 frames a second, in colours picked from those frames.
Limits. Set by your plan.
- An image output (.jpg, .jpeg, .png) holds one image. For several, name several outputs in one job.
- A storyboard grid holds at most 256 cells.
- Inputs are public http or https URLs, or completed private uploads up to 100 MB and your plan’s input limit. Outputs have signed download links. A job names up to 16 input and 16 output files.
| Limit | Pay as you go | Starter | Pro | Scale |
|---|---|---|---|---|
| Longest job | 10 min | 10 min | 30 min | 60 min |
| Inputs per job | 1 GB | 1 GB | 5 GB | 10 GB |
| Outputs per job | 1 GB | 1 GB | 5 GB | 8 GB |
| Outputs expire after | 7 days | 7 days | 30 days | 30 days |
Pay as you go
- Longest job
- 10 min
- Inputs per job
- 1 GB
- Outputs per job
- 1 GB
- Outputs expire after
- 7 days
Starter
- Longest job
- 10 min
- Inputs per job
- 1 GB
- Outputs per job
- 1 GB
- Outputs expire after
- 7 days
Pro
- Longest job
- 30 min
- Inputs per job
- 5 GB
- Outputs per job
- 5 GB
- Outputs expire after
- 30 days
Scale
- Longest job
- 60 min
- Inputs per job
- 10 GB
- Outputs per job
- 8 GB
- Outputs expire after
- 30 days
Soon. Planned, not available yet.
Storyboards with WebVTT Soon
A sprite of frames and the WebVTT file that tells a player which frame belongs to which time.