# Ten evenly spaced thumbnails from two videos

**Use case:** 

Ten evenly spaced frames from each of two public-domain videos on Wikimedia Commons (a Hubble animation of Jupiter and a NASA animation of a magnetar), saved as JPG with a public link per frame, its exact time in the video and the length, size and codec of the video. Replace the links with your own video files to build thumbnails or a preview strip.

## Input

```json
{
  "videoUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/5/5e/Jupiter-HubbleSpaceTelescope-Animation-20190823.webm",
    "https://upload.wikimedia.org/wikipedia/commons/2/2d/NASA%27s_NICER_Tracks_a_Magnetar%27s_Hot_Spots_%28SVS14115_-_02_MAGNETAR_Wide_view_BlipOnly_web%29.webm"
  ],
  "mode": "count",
  "framesPerVideo": 10,
  "intervalSeconds": 10,
  "sceneThreshold": 0.4,
  "format": "jpg",
  "quality": 85,
  "maxWidth": 1280,
  "maxVideoMegabytes": 500,
  "maxDurationMinutes": 120,
  "maxItems": 0,
  "onlyNew": false,
  "stateName": "default",
  "notifyWhenEmpty": false,
  "requestIntervalMs": 1000
}
```

## Output

```json
{
  "videoUrl": {
    "label": "Address of the video the frame comes from (as given, without a #fragment)",
    "format": "string"
  },
  "frameIndex": {
    "label": "Number of the frame within its video, from 1; null on a row without a frame",
    "format": "integer"
  },
  "timestamp": {
    "label": "The same position as hh:mm:ss.mmm",
    "format": "string"
  },
  "imageUrl": {
    "label": "Public link to the frame image in this run's key-value store; null on a row without a frame",
    "format": "string"
  },
  "width": {
    "label": "Width of the saved image in pixels",
    "format": "integer"
  },
  "height": {
    "label": "Height of the saved image in pixels",
    "format": "integer"
  },
  "bytes": {
    "label": "Size of the saved image in bytes",
    "format": "integer"
  },
  "status": {
    "label": "saved for a delivered frame; for a video that gave no frame the reason: invalid, unsupported_platform, unsupported_streaming, not_video, blocked, robots_disallowed, not_found, too_large, too_long, unreadable, no_frames or error",
    "format": "string"
  }
}
```

## How it works

### 1. Sign up on Apify or log in

The Video Frame Extractor: Thumbnails and Frames from Video URLs Actor is ready to run with the inputs already set for "Ten evenly spaced thumbnails from two videos". [Sign up or log in](https://console.apify.com/create-task-from-example/3m7INCopQr5qmUVcA) and you'll land in Apify Console with a copy of this exact task.

### 2. Start the "Ten evenly spaced thumbnails from two videos" task

The Video Frame Extractor: Thumbnails and Frames from Video URLs Actor will start running based on the input automatically. You can also change all the input fields, like video urls, how to pick the frames, and more, to match your specific use case.

### 3. Receive the "Ten evenly spaced thumbnails from two videos" output

Monitor the progress in real time. You will be notified as soon as your dataset is complete and ready for review. Each result includes data such as address of the video the frame comes from (as given, without a #fragment), number of the frame within its video, from 1; null on a row without a frame, the same position as hh:mm:ss.mmm, and more.

### 4. Integrate into your workflow

The final output is delivered in JSON, CSV, or Excel format, ready to be plugged into your workflow. You can also [run the "Ten evenly spaced thumbnails from two videos" task via API](https://apify.com/rowcraft/video-frame-extractor.md).

## About this Actor

This example demonstrates how to use [Video Frame Extractor: Thumbnails and Frames from Video URLs](https://apify.com/rowcraft/video-frame-extractor.md) with a specific input configuration. Visit the [Actor detail page](https://apify.com/rowcraft/video-frame-extractor.md) to learn more, explore other use cases, and run it yourself.


## How to integrate an Actor?

This Task's input is already configured above. Use it as-is rather than inventing a new one.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For full API examples (JavaScript, Python, CLI, MCP, OpenAPI), see this Task's Actor page: https://apify.com/rowcraft/video-frame-extractor.md

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).
