Guide · AWS MediaConvert · Job Templates
AWS MediaConvert Job Templates and Presets — Reusable Transcoding Settings for MCP Pipelines
MediaConvert job templates and output presets eliminate the need to reconstruct complex transcoding settings JSON for every job — templates encode your standard output formats once so MCP tools only specify what changes per job: the input file and the output destination. A preset captures a single output's codec and container settings (resolution, bitrate, codec profile). A job template captures one or more output groups, each referencing one or more presets, plus queue and role defaults. When you create a job with a template reference, MediaConvert merges the template's output settings with your per-job input and destination overrides. This means a Lambda function that processes video uploads needs only a 20-line payload instead of a 200-line settings blob — and when encoding requirements change (new codec, new rendition), you update the template once rather than every caller. AWS provides system presets (read-only, maintained by AWS) and you can create custom presets that match your exact quality requirements.
TL;DR
Create output presets with create-preset containing codec and container settings for a single rendition. Create a job template with create-job-template that references presets in its output groups. Submit jobs with --job-template ARN and provide only Inputs in the settings — the template supplies all output groups. Use list-presets --list-by SYSTEM to browse AWS-managed presets before building custom ones. Update templates with update-job-template; changes apply to new jobs only (in-flight jobs use the snapshot taken at submission time).
Understanding presets vs job templates
Presets and job templates operate at different levels of the MediaConvert hierarchy. A preset represents one output — its container (MP4, TS, WebM), codec (H.264, H.265, VP9), resolution, bitrate, and audio codec. A job template represents the full job structure: one or more output groups, each containing one or more outputs (each output referencing a preset), plus default queue and IAM role assignments. You can mix preset-referenced outputs with inline output settings within the same job template.
# List AWS system presets to find a good starting point
ENDPOINT="https://abc123def456.mediaconvert.us-east-1.amazonaws.com"
aws mediaconvert list-presets \
--endpoint-url "$ENDPOINT" \
--list-by SYSTEM \
--query 'Presets[*].{Name:Name,Description:Description}' \
--output table
# Shows presets like:
# System-Generic_Hd_Mp4_Avc_Aac_16x9_1920x1080p_24Hz_6Mbps
# System-Generic_Sd_Mp4_Avc_Aac_4x3_640x480p_24Hz_1.5Mbps
# System-Generic_Hd_Ts_Avc_Aac_16x9_1920x1080p_25Hz_8.5Mbps
# Get the settings JSON of a system preset to use as a base
aws mediaconvert get-preset \
--endpoint-url "$ENDPOINT" \
--name "System-Generic_Hd_Mp4_Avc_Aac_16x9_1920x1080p_24Hz_6Mbps" \
--query 'Preset.Settings' \
--output json > base-1080p-preset.json
System presets cover common delivery formats — web HD, web SD, social media, broadcast, and mobile. Before building a custom preset, check if an AWS system preset meets your requirements. System presets are read-only and always available; custom presets are account-scoped and must be created in each region where you process video.
Creating a custom output preset
Custom presets let you specify exact codec parameters, CBR vs VBR rate control, quality normalization (QVBR), and audio layout. The Settings object contains VideoDescription, AudioDescriptions, and ContainerSettings. For web delivery, H.264 High profile with QVBR rate control produces the best quality-per-bit — QVBR adjusts bitrate per-scene rather than fixing it, improving both quality and file size versus CBR.
# Create a custom 1080p H.264 QVBR preset for web delivery
aws mediaconvert create-preset \
--endpoint-url "$ENDPOINT" \
--name "web-1080p-h264-qvbr" \
--description "1080p H.264 QVBR for web delivery, AAC stereo" \
--settings '{
"ContainerSettings": {
"Container": "MP4",
"Mp4Settings": {
"CslgAtom": "INCLUDE",
"FreeSpaceBox": "EXCLUDE",
"MoovPlacement": "PROGRESSIVE_DOWNLOAD"
}
},
"VideoDescription": {
"Width": 1920,
"Height": 1080,
"ScalingBehavior": "DEFAULT",
"TimecodeInsertion": "DISABLED",
"AntiAlias": "ENABLED",
"Sharpness": 50,
"CodecSettings": {
"Codec": "H_264",
"H264Settings": {
"InterlaceMode": "PROGRESSIVE",
"NumberReferenceFrames": 3,
"Syntax": "DEFAULT",
"Softness": 0,
"FramerateControl": "SPECIFIED",
"FramerateNumerator": 30000,
"FramerateDenominator": 1001,
"RateControlMode": "QVBR",
"QvbrSettings": {
"QvbrQualityLevel": 8
},
"MaxBitrate": 8000000,
"CodecProfile": "HIGH",
"CodecLevel": "AUTO",
"FieldEncoding": "PAFF",
"SceneChangeDetect": "ENABLED",
"GopSize": 90,
"Slices": 1,
"GopBReference": "DISABLED",
"EntropyEncoding": "CABAC",
"AdaptiveQuantization": "HIGH"
}
}
},
"AudioDescriptions": [{
"AudioSourceName": "Audio Selector 1",
"AudioTypeControl": "FOLLOW_INPUT",
"CodecSettings": {
"Codec": "AAC",
"AacSettings": {
"AudioDescriptionBroadcasterMix": "NORMAL",
"Bitrate": 128000,
"RateControlMode": "CBR",
"CodecProfile": "LC",
"CodingMode": "CODING_MODE_2_0",
"RawFormat": "NONE",
"SampleRate": 48000,
"Specification": "MPEG4"
}
}
}]
}'
# Also create a 720p variant for mobile delivery
aws mediaconvert create-preset \
--endpoint-url "$ENDPOINT" \
--name "web-720p-h264-qvbr" \
--description "720p H.264 QVBR for mobile delivery, AAC stereo" \
--settings '{
"ContainerSettings": { "Container": "MP4", "Mp4Settings": { "MoovPlacement": "PROGRESSIVE_DOWNLOAD" } },
"VideoDescription": {
"Width": 1280, "Height": 720,
"CodecSettings": {
"Codec": "H_264",
"H264Settings": {
"RateControlMode": "QVBR",
"QvbrSettings": { "QvbrQualityLevel": 7 },
"MaxBitrate": 4000000,
"CodecProfile": "HIGH",
"FramerateControl": "SPECIFIED",
"FramerateNumerator": 30000,
"FramerateDenominator": 1001
}
}
},
"AudioDescriptions": [{
"AudioSourceName": "Audio Selector 1",
"CodecSettings": {
"Codec": "AAC",
"AacSettings": { "Bitrate": 96000, "CodingMode": "CODING_MODE_2_0", "SampleRate": 48000 }
}
}]
}'
The QvbrQualityLevel range is 1-10. Level 8 is appropriate for archive/delivery quality; level 7 for mobile (slightly smaller files); level 9-10 for broadcast-quality outputs. QVBR with MaxBitrate caps spend on complex scenes while allowing the codec to use fewer bits on static content — a 90-minute film at QVBR 8 / 8 Mbps max typically averages 3-5 Mbps, reducing storage and transfer costs compared to CBR 6 Mbps.
Creating a job template
A job template bundles one or more output groups — each group can be a file delivery group (MP4), HLS group, DASH group, or thumbnail group. Each output within a group references either a custom preset by name or an inline settings block. The template also sets default queue and IAM role, which create-job can override per-call.
# Create a job template: 1080p MP4 + 720p MP4 (web delivery package)
aws mediaconvert create-job-template \
--endpoint-url "$ENDPOINT" \
--name "web-delivery-package" \
--description "1080p + 720p MP4 for web delivery, output to s3://DESTINATION" \
--queue "arn:aws:mediaconvert:us-east-1:123456789012:queues/Default" \
--settings '{
"OutputGroups": [{
"Name": "File Group",
"OutputGroupSettings": {
"Type": "FILE_GROUP_SETTINGS",
"FileGroupSettings": {
"Destination": "s3://DESTINATION_PLACEHOLDER/"
}
},
"Outputs": [
{
"Preset": "web-1080p-h264-qvbr",
"NameModifier": "_1080p"
},
{
"Preset": "web-720p-h264-qvbr",
"NameModifier": "_720p"
}
]
}]
}'
# Use the template in a job — only supply Input, template handles outputs
aws mediaconvert create-job \
--endpoint-url "$ENDPOINT" \
--role "$ROLE_ARN" \
--job-template "arn:aws:mediaconvert:us-east-1:123456789012:jobTemplates/web-delivery-package" \
--settings '{
"Inputs": [{
"FileInput": "s3://my-video-input/uploads/raw.mp4",
"AudioSelectors": {
"Audio Selector 1": { "DefaultSelection": "DEFAULT" }
},
"VideoSelector": {}
}],
"OutputGroups": [{
"OutputGroupSettings": {
"FileGroupSettings": {
"Destination": "s3://my-video-output/processed/video-001/"
}
}
}]
}'
When you provide an OutputGroups array in the create-job call alongside a template, the groups are merged positionally — the first group in your settings overrides the first group in the template. This is how you override the Destination per job while keeping all codec settings from the template. Only override the fields that change per job — the destination S3 prefix in this case.
Updating and versioning templates
MediaConvert does not have built-in template versioning — update-job-template overwrites in place. Jobs that have already been submitted use a snapshot of the template settings taken at submission time; only new jobs pick up the updated settings. For production MCP pipelines that need rollback capability, use a naming convention like web-delivery-v2 and update code to reference the new template name — keep the old template for in-flight retries.
# Update a template's settings (affects only new jobs)
aws mediaconvert update-job-template \
--endpoint-url "$ENDPOINT" \
--name "web-delivery-package" \
--settings '{
"OutputGroups": [{
"Name": "File Group",
"OutputGroupSettings": {
"Type": "FILE_GROUP_SETTINGS",
"FileGroupSettings": { "Destination": "s3://DESTINATION_PLACEHOLDER/" }
},
"Outputs": [
{ "Preset": "web-1080p-h264-qvbr", "NameModifier": "_1080p" },
{ "Preset": "web-720p-h264-qvbr", "NameModifier": "_720p" },
{ "Preset": "web-360p-h264-qvbr", "NameModifier": "_360p" }
]
}]
}'
# List all custom job templates in the account
aws mediaconvert list-job-templates \
--endpoint-url "$ENDPOINT" \
--list-by CUSTOM \
--query 'JobTemplates[*].{Name:Name,ARN:Arn,Created:CreatedAt}' \
--output table
# Export a template's full settings for IaC storage
aws mediaconvert get-job-template \
--endpoint-url "$ENDPOINT" \
--name "web-delivery-package" \
--output json > templates/web-delivery-package.json
Store exported template and preset JSON files in version control alongside your MCP server code. When deploying to a new AWS account or region, apply templates in dependency order: create presets first, then templates that reference them. A Terraform or CDK module that calls the MediaConvert API at deploy time (using a custom resource or a post-deploy script) keeps your transcoding configuration reproducible.
Failure modes reference
| Failure | Symptom | Fix |
|---|---|---|
| Preset not found | Job creation fails with ResourceNotFoundException referencing preset name | Preset names are case-sensitive and region-scoped — verify the preset exists in the same region as the job and the name matches exactly including capitalization |
| Template output group merge mismatch | Destination override not applied — output files land in template's placeholder path | Template output group merge is positional — if your create-job settings include 0 output groups, no override applies; include at least one output group with just the FileGroupSettings.Destination field to trigger the merge |
| QVBR quality level out of range | ValidationException mentioning QvbrQualityLevel | Valid range is 1–10; decimals are not accepted; level 0 is invalid — use integers only |
| Audio missing in output | Output MP4 has no audio track | Each output must have an AudioDescriptions array — presets created without audio settings produce video-only outputs; add an AudioDescriptions entry referencing Audio Selector 1 in the preset settings |
| Template creation fails with preset reference | ValidationException: Preset 'my-preset' not found | The template and preset must be in the same AWS account and region; cross-region preset references are not supported |
| MoovPlacement causing seek issues | Web browser cannot seek into MP4 before download completes | Set MoovPlacement: PROGRESSIVE_DOWNLOAD in Mp4Settings to move the moov atom to the beginning of the file — required for HTTP range-request based seeking in web players |