> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mixpeek.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Video Transcode Extractor

> Convert RED R3D, ARRI RAW and mixed-codec video to a web-playable H.264 or H.265 MP4 mezzanine in object storage

<Warning>
  Built-in extractor names are a **deprecated alias** — collections are now created by picking [features](/docs/processing/features). This pipeline is selected with `features: ["video_transcode"]` as a video add-on. Existing `feature_extractor` configs keep working; see the [migration guide](/docs/processing/extractor-migration).
</Warning>

The transcoding extractor converts source video to a web-playable MP4 in your object
storage. It picks a decode path per file:

1. **RED R3D** through the REDline CLI.
2. **ARRI RAW** (`.ari`, `.arriraw`, `.arx`, or ARRI codecs inside MXF and MOV
   containers) through ART CMD.
3. **Everything else** through FFmpeg.

Containers are codec-probed with `ffprobe` before routing, so a misleading file
extension does not send a file down the wrong path.

Use it to make RAW camera archives ingestable and playable, and to normalize a
mixed-codec library to one mezzanine format. It does not produce scenes or embeddings.
Chain a collection with a video or multimodal extractor on top of the converted output
for those.

<Note>
  View extractor details at [api.mixpeek.com/v1/collections/features/extractors/transcoding\_extractor\_v1](https://api.mixpeek.com/v1/collections/features/extractors/transcoding_extractor_v1) or fetch programmatically with `GET /v1/collections/features/extractors/{feature_extractor_id}`.
</Note>

## Create the collection

```json theme={null}
{
  "collection_name": "playable-masters",
  "source": { "type": "bucket", "bucket_ids": ["bkt_raw_footage"] },
  "features": ["video_transcode"]
}
```

`video_transcode` is a companion add-on, so enabling it creates a companion collection
alongside the base video collection rather than adding a field to it.

## Parameters

Every parameter has a default, so `parameters` is optional.

| Parameter             | Default   | Values                                                                                        |
| --------------------- | --------- | --------------------------------------------------------------------------------------------- |
| `output_codec`        | `libx264` | `libx264` for player compatibility, `libx265` for smaller files.                              |
| `crf`                 | `23`      | 0 to 51. Lower is higher quality and larger. 18 to 23 is the usual H.264 range.               |
| `preset`              | `medium`  | `ultrafast` through `veryslow`. Slower compresses better and costs more CPU.                  |
| `max_resolution`      | `1080`    | Caps output height in pixels; width scales with it. Set `null` to keep the source resolution. |
| `audio_codec`         | `aac`     | `aac`, `mp3`, or `copy` to pass the source audio through.                                     |
| `require_native_sdks` | `false`   | See below.                                                                                    |

<Warning>
  **`require_native_sdks` decides what a RAW file does when the vendor SDK is absent.**
  RED and ARRI decoding need the REDline and ART CMD binaries on the engine image. When
  they are missing, the default `false` falls back to FFmpeg and produces a file
  anyway, which for a RAW source can mean wrong color or a failed decode you only notice
  downstream.

  Set `require_native_sdks: true` for RED or ARRI sources. The file fails loudly instead
  of degrading quietly, which is the outcome you want when the alternative is a
  silently wrong master.
</Warning>

To set parameters, declare the extractor explicitly. Register it on the namespace
first, then map the video field on the collection:

```bash theme={null}
curl -X PATCH "https://api.mixpeek.com/v1/namespaces/$NAMESPACE_ID" \
  -H "Authorization: Bearer $MIXPEEK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "feature_extractors": [
      { "feature_extractor_name": "transcoding_extractor", "version": "v1" }
    ]
  }'
```

`feature_extractors` appends, so existing extractors on the namespace are kept.

Then on the collection:

```json theme={null}
{
  "feature_extractor": {
    "feature_extractor_name": "transcoding_extractor",
    "version": "v1",
    "input_mappings": { "video": "video" },
    "parameters": {
      "output_codec": "libx264",
      "crf": 20,
      "max_resolution": null,
      "require_native_sdks": true
    }
  }
}
```

## Output

One document per source object:

| Field                  | Meaning                                   |
| ---------------------- | ----------------------------------------- |
| `converted_url`        | Object-storage URL of the transcoded MP4. |
| `source_format`        | `r3d`, `arri`, or `standard`.             |
| `width`, `height`      | Output dimensions in pixels.              |
| `duration_sec`         | Output duration.                          |
| `converted_size_bytes` | Size of the converted file.               |

Accepted inputs are R3D, ARI, ARRIRAW, ARX, MXF, MP4, MOV, AVI, MKV, WebM, and anything
else FFmpeg decodes.

## Pricing

`video_transcode` bills at **\$0.015 per minute** of video as a video add-on. Rates on
this page can change; the [billing page](/docs/platform/billing) and
`GET /v1/billing/pricing` are the live source.
