Skip to content
All use cases
Media & Streaming

Generate thumbnails and a scrubbing sprite sheet for your video library

One SVT Encore job on Open Source Cloud writes poster frames and a single sprite sheet: one JPEG holding 240 small tiles that a player shows as previews while someone drags the seek bar. You run Encore and S3-compatible storage as two catalog services and submit the job over HTTP.

Updated

What one job produces

These are the image files from a job we ran on OSC on 2026-11-08, using the public program test profile and a 105.7-second 1080p clip. The job completed in 123 seconds.

FileWhat it isDimensions
VINN_thumb01.jpgPoster frame at 25, 50 or 75 percent of the video1920x1080
VINN_thumb02.jpgPoster frame at 25, 50 or 75 percent of the video1920x1080
VINN_thumb03.jpgPoster frame at 25, 50 or 75 percent of the video1920x1080
VINN_12x20_160x90_thumbnail_map.jpgSprite sheet: 12 columns by 20 rows of 160x90 tiles1920x1800

The program profile also writes five H.264 MP4 renditions from 234p to 1080p and a stereo audio file, so the same job gives you the files to stream. Dimensions were confirmed with ffprobe on the downloaded images. This is one job on one clip, on the Encore image OSC ran that day (v0.2.8-3).

How to generate thumbnails and a sprite sheet with Encore

Four steps, from the OSC web console or from your own code.

  1. 1

    Create storage

    Create a MinIO instance and a bucket for the output. Set the root user and password yourself when you create it: an instance created without them came back with empty credentials in our run.

  2. 2

    Create an Encore instance

    Create an instance of the encore service. Set profilesUrl to a list of Encore profiles, s3Endpoint to the MinIO instance, and s3AccessKeyId and s3SecretAccessKey to its credentials. The public test list is at https://raw.githubusercontent.com/Eyevinn/encore-test-profiles/main/profiles.yml.

  3. 3

    Submit the job

    Send the request below to your instance, with an OSC service access token as the bearer token.

  4. 4

    Read the result

    Poll GET /encoreJobs/{id} until the status is SUCCESSFUL, then read the output array. It lists every file with its dimensions. Check that the thumbnail map is in the list, because status alone does not prove it: see the optional setting below.

The request

Replace the instance address, the bucket and the input. Encore must be able to reach the input over HTTP or HTTPS.

POST https://<your-encore-instance>/encoreJobs
Authorization: Bearer <service access token>
Content-Type: application/json

{
  "profile": "program",
  "baseName": "VINN",
  "outputFolder": "s3://<bucket>/thumbs/",
  "inputs": [
    {
      "type": "AudioVideo",
      "uri": "https://testcontent.eyevinn.technology/mp4/VINN.mp4"
    }
  ]
}

Settings you can change

  • In a ThumbnailEncode profile entry, percentages sets where the poster frames are taken (default 25, 50 and 75), and intervalSeconds takes one every N seconds instead.
  • In a ThumbnailMapEncode entry, cols, rows, tileWidth and tileHeight set the grid. The defaults are 12, 20, 160 and 90.
  • The time between tiles is the video duration divided by cols times rows. The default grid is always 240 tiles, so a tile covers about 0.44 seconds of the 105.7-second clip and 30 seconds of a two-hour film. Raise rows for long videos.
  • ThumbnailMapEncode defaults to optional: true, so a job can succeed with the sprite sheet silently skipped. Set optional: false to make that a failure.
  • The thumbnail map is not supported in a segmented encode: with segmentLength set on the job it is skipped, or fails if optional is false.

Using the sprite sheet in a player

Encore writes the image, not the file a player needs to find each tile. You generate that yourself: a WebVTT file with one cue per tile, each pointing at the tile coordinates with #xywh=x,y,width,height. Tiles run left to right and top to bottom, so tile n is at column n modulo cols and row n divided by cols, rounded down. The first cues for the clip above:

Example

WEBVTT

00:00:00.000 --> 00:00:00.440
https://<your-storage>/<bucket>/thumbs/VINN_12x20_160x90_thumbnail_map.jpg#xywh=0,0,160,90

00:00:00.440 --> 00:00:00.881
https://<your-storage>/<bucket>/thumbs/VINN_12x20_160x90_thumbnail_map.jpg#xywh=160,0,160,90

00:00:00.881 --> 00:00:01.321
https://<your-storage>/<bucket>/thumbs/VINN_12x20_160x90_thumbnail_map.jpg#xywh=320,0,160,90

Shaka Player loads such a file with player.addThumbnailsTrack(url) and reads the #xywh coordinates in its source code; Vidstack also documents WebVTT thumbnails with sprite coordinates. The page that hosts the player must be able to fetch both the WebVTT file and the JPEG, so the storage needs public read access or signed URLs.

We read the player support in the Shaka Player source and the Vidstack documentation. We did not run these files through a player for this page.

Let your AI agent set it up

Connect your AI agent to the OSC MCP server and give it the prompt below.

Prompt

Create a MinIO instance called thumbstore with a generated root user and a strong generated password, and a bucket called media. Create an Encore instance called thumbencore with profilesUrl https://raw.githubusercontent.com/Eyevinn/encore-test-profiles/main/profiles.yml, using thumbstore as the S3 endpoint with its credentials. Submit an Encore job with profile program, baseName myvideo, my video URL as the input and s3://media/thumbs/ as the output folder. Poll until the job is done and list the files in output.

We created the instances with the OSC MCP tools and posted the job to the instance API, but we did not run this exact prompt.

Machine-readable recipe (JSON)

Open source, standard files

SVT Encore is public on GitHub under EUPL-1.2 and MinIO speaks the S3 API. The output is plain JPEG, MP4 and, once you generate it, WebVTT, with no proprietary wrapper, so you can move the files and the job definition anywhere Encore runs.

Related

Frequently asked questions

What is a sprite sheet for video?

One image that holds many small frames from a video in a grid. A player crops the right tile as the viewer drags the seek bar, so previews appear without fetching a separate image for each position.

Does Encore write the WebVTT thumbnail file?

No. The job writes the JPEG sprite sheet. You generate the WebVTT file from the grid size and the video duration.

How many preview images do I get?

240 with the default grid of 12 columns and 20 rows, whatever the video length. The time between previews grows with duration, so change rows and cols for long videos.

Can a job succeed without the sprite sheet?

Yes. The sprite sheet is optional by default, so check the output array, or set optional: false on ThumbnailMapEncode.

Can I use S3 instead of MinIO?

The Encore service has s3Endpoint and s3Region settings for this. Our test job wrote to MinIO, and we did not run one against AWS S3.

What does it cost?

Current rates are on osaas.io/pricing. This guide does not quote one.

Generate your first sprite sheet

Sign up for Open Source Cloud, then create a MinIO and an Encore instance.