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)

S3 Upload Lambda Trigger MediaConvert Job S3 Output + EventBridge
# 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.