Key Takeaways
- AWS Elemental MediaConvert is a fully managed, file-based video transcoding service — no servers, no codec licensing headaches, pay per minute processed.
- It outputs adaptive bitrate formats (HLS, DASH) alongside standard MP4/MOV, making it the backbone of most cloud VOD pipelines.
- Jobs are defined declaratively as JSON job specifications, which makes them easy to template and automate.
- A common serverless pattern: S3 upload triggers Lambda, Lambda submits a MediaConvert job, completion triggers a notification or CDN cache invalidation.
- Queues (on-demand or reserved) control throughput and cost — reserved queues give predictable pricing for high, steady volume.
Why MediaConvert Instead of Self-Hosted FFmpeg
Running your own FFmpeg fleet works until volume grows — then you're managing codec licensing, patching, autoscaling for bursty encode jobs, and GPU/CPU capacity planning. MediaConvert removes all of that: you submit a job description, AWS handles the compute, and you pay per minute of output processed, with volume-tiered pricing.
It also natively understands broadcast and streaming formats that are painful to configure correctly by hand — HLS/DASH packaging, closed captions (CEA-608/708, WebVTT), DRM integration, and audio normalization.
Core Concepts
Jobs
A job is a one-time transcode request: input file(s), one or more output groups, and settings for each. Jobs run asynchronously; you poll status or receive an EventBridge notification on completion.
Job templates and presets
Job templates define the full output structure (useful for "our standard VOD package"); presets define individual output settings (useful for "1080p H.264 at 5 Mbps") that templates reference.
Queues
- On-demand queue — default, pay-as-you-go, shared capacity.
- Reserved queue — dedicated transcoding slots for predictable, high-volume throughput at a flat hourly reservation cost.
Submitting a Basic Job via CLI
# Submit a MediaConvert job from a JSON job specification
aws mediaconvert create-job \
--endpoint-url https://abc123.mediaconvert.us-east-1.amazonaws.com \
--cli-input-json file://job.json
// job.json — transcode an MP4 to an HLS adaptive bitrate package
{
"Role": "arn:aws:iam::123456789012:role/MediaConvertServiceRole",
"Settings": {
"Inputs": [
{
"FileInput": "s3://f9-video-input/raw/sample.mp4"
}
],
"OutputGroups": [
{
"Name": "HLS Group",
"OutputGroupSettings": {
"Type": "HLS_GROUP_SETTINGS",
"HlsGroupSettings": {
"Destination": "s3://f9-video-output/hls/sample/",
"SegmentLength": 6,
"MinSegmentLength": 0
}
},
"Outputs": [
{
"NameModifier": "_720p",
"VideoDescription": {
"Width": 1280,
"Height": 720,
"CodecSettings": {
"Codec": "H_264",
"H264Settings": { "Bitrate": 3000000, "RateControlMode": "CBR" }
}
},
"AudioDescriptions": [
{ "CodecSettings": { "Codec": "AAC", "AacSettings": { "Bitrate": 96000, "SampleRate": 48000 } } }
]
},
{
"NameModifier": "_480p",
"VideoDescription": {
"Width": 854,
"Height": 480,
"CodecSettings": {
"Codec": "H_264",
"H264Settings": { "Bitrate": 1200000, "RateControlMode": "CBR" }
}
}
}
]
}
]
}
}
Automating with Lambda (Event-Driven Pipeline)
# lambda_function.py — triggered by S3:ObjectCreated, submits a MediaConvert job
import boto3
import os
MEDIACONVERT_ENDPOINT = os.environ["MEDIACONVERT_ENDPOINT"]
ROLE_ARN = os.environ["MEDIACONVERT_ROLE_ARN"]
client = boto3.client("mediaconvert", endpoint_url=MEDIACONVERT_ENDPOINT)
def lambda_handler(event, context):
bucket = event["Records"][0]["s3"]["bucket"]["name"]
key = event["Records"][0]["s3"]["object"]["key"]
input_uri = f"s3://{bucket}/{key}"
response = client.create_job(
Role=ROLE_ARN,
Settings={
"Inputs": [{"FileInput": input_uri}],
"OutputGroups": [
{
"Name": "HLS Group",
"OutputGroupSettings": {
"Type": "HLS_GROUP_SETTINGS",
"HlsGroupSettings": {
"Destination": f"s3://f9-video-output/hls/{key.split('/')[-1]}/"
},
},
"Outputs": [
{
"NameModifier": "_720p",
"VideoDescription": {"Width": 1280, "Height": 720},
}
],
}
],
},
)
return {"jobId": response["Job"]["Id"]}
Monitoring Job Status
aws mediaconvert get-job \
--endpoint-url https://abc123.mediaconvert.us-east-1.amazonaws.com \
--id 1234567890123-abcdef
Subscribe an EventBridge rule to COMPLETE, ERROR, and PROGRESSING job status-change events to drive downstream automation like CDN cache invalidation or metadata updates.
Cost Control Tips
- Use accelerated transcoding only when it's actually faster for your content type — it has a cost premium.
- Right-size output ladders — don't generate a 4K rendition nobody's bandwidth will request.
- Move to a reserved queue once steady monthly minute volume makes the flat reservation cheaper than on-demand.
- Clean up intermediate/proxy files from S3 with lifecycle rules.
FAQ
Does MediaConvert support live streaming? No — MediaConvert is file-based (VOD). For live streams, use AWS Elemental MediaLive feeding into MediaPackage.
What output formats does MediaConvert support? MP4, MOV, HLS, DASH, MXF, and more, with support for H.264, H.265/HEVC, AV1, and ProRes codecs depending on the output group.
How is pricing calculated? Per minute of output video processed, with pricing tiers by resolution (SD, HD, UHD) and a separate rate for audio-only outputs; reserved queues charge a flat hourly rate instead.
Can MediaConvert add captions automatically? It can embed or burn in existing caption files (SRT, WebVTT, SCC) but doesn't generate captions from scratch — pair it with Amazon Transcribe for that.
Build Your Video Pipeline With f9infotech
From job template design to end-to-end serverless automation, f9infotech's AWS media engineering team can help you build a MediaConvert pipeline that scales with your content volume without surprise costs.