AWS MediaConvert is the right choice for large-scale video processing: broadcast-quality encoding, HLS/DASH adaptive streaming, Dolby audio, captions, and deep AWS ecosystem integration (IAM, S3, CloudWatch, Lambda). It's overbuilt for teams that just need to convert a video from one format to another.

The hidden cost of MediaConvert for simple use cases isn't the per-minute encoding fee (which is competitive). It's the infrastructure overhead: IAM roles, S3 input/output buckets, VPC configuration, CloudWatch monitoring, and the 50-line job JSON to configure a basic transcode. If your "video transcoding pipeline" is really just "convert this MP4 to WebM," that complexity doesn't pay for itself.

Who should migrate (and who should stay)

Consider migrating if:

  • You use MediaConvert only for simple format conversion (MP4↔WebM, MOV→MP4, AVI→MP4)
  • Your pipeline is straightforward: one input file, one output format
  • You don't use HLS/DASH outputs or adaptive bitrate streaming
  • Files are under 500MB and conversions complete in under 2 minutes
  • You're paying for AWS infrastructure (S3 input/output buckets, IAM roles) solely to support MediaConvert
  • You want conversions to work without managing AWS credentials, IAM policies, and S3 bucket permissions

Do NOT migrate if:

  • You generate HLS or DASH manifests for adaptive streaming
  • You need broadcast-quality encoding with specific codec profiles (H.264 High, HEVC Main10, etc.)
  • You process files already in S3 and want output back to S3
  • You need Dolby audio, captions/subtitles, or image overlays
  • You run large-scale batch encoding (thousands of hours of video per month)
  • Your pipeline is deeply integrated with other AWS services (Lambda triggers, SQS, CloudWatch alarms)
  • You need on-demand reserved pricing to reduce per-minute costs at volume

Cost comparison for simple conversion use cases

Volume/monthAWS MediaConvert (est.)ChangeThisFileMonthly savings
100 short clips (2–5 min each)~$5–15 (encoding) + S3 + data transfer$0 (free tier)$5–15+
500 short clips~$20–50 + infrastructure$29 (Hobby)Variable, often $0–21
2,000 conversions (mixed video)~$50–150 + infrastructure$99 (Startup)-$49 to +$51

The "real" cost of MediaConvert for simple use cases includes:

  • S3 storage for input files (while waiting for job completion)
  • S3 storage for output files (until your application downloads them)
  • S3 data transfer costs (upload input, download output)
  • Per-minute encoding fees ($0.0075–$0.0150/min depending on output resolution)
  • Developer time maintaining IAM roles, S3 bucket policies, and job configuration code

For short clips at low volume, the infrastructure overhead often costs more than the encoding itself. ChangeThisFile's per-conversion pricing is predictable and includes no infrastructure overhead.

API approach comparison

MediaConvert conceptChangeThisFile equivalent
S3 upload of input fileMultipart file in POST body
CreateJob API call (complex JSON)POST /v1/convert (target field)
JobSettings.OutputGroups[].Outputs[].ContainerSettingsdata.target: "mp4" or "webm"
IAM role for MediaConvertBearer token in Authorization header
S3 output bucketresponse.content (file bytes)
Poll job status via GetJobSynchronous — no polling needed
S3 download of output fileNot needed — file in response
AWS SDK (boto3)requests.post() — no SDK

Code migration: BEFORE and AFTER

# BEFORE: AWS MediaConvert (boto3, S3, IAM, job polling)
import boto3
import time

# AWS clients
s3 = boto3.client('s3')
mc = boto3.client('mediaconvert', endpoint_url='https://ENDPOINT.mediaconvert.us-east-1.amazonaws.com')

# Step 1: Upload input to S3
s3.upload_file('video.mov', 'my-input-bucket', 'input/video.mov')

# Step 2: Create MediaConvert job
job = mc.create_job(
    Role='arn:aws:iam::123456789:role/MediaConvertRole',
    Settings={
        'Inputs': [{
            'FileInput': 's3://my-input-bucket/input/video.mov',
            'AudioSelectors': {'Audio Selector 1': {'DefaultSelection': 'DEFAULT'}},
            'VideoSelector': {}
        }],
        'OutputGroups': [{
            'Name': 'File Group',
            'OutputGroupSettings': {
                'Type': 'FILE_GROUP_SETTINGS',
                'FileGroupSettings': {'Destination': 's3://my-output-bucket/output/'}
            },
            'Outputs': [{
                'ContainerSettings': {'Container': 'MP4'},
                'VideoDescription': {
                    'CodecSettings': {
                        'Codec': 'H_264',
                        'H264Settings': {
                            'RateControlMode': 'QVBR',
                            'QualityTuningLevel': 'SINGLE_PASS_HQ'
                        }
                    }
                },
                'AudioDescriptions': [{
                    'CodecSettings': {
                        'Codec': 'AAC',
                        'AacSettings': {'Bitrate': 192000, 'SampleRate': 48000}
                    }
                }]
            }]
        }]
    }
)
job_id = job['Job']['Id']

# Step 3: Poll until complete
while True:
    job_status = mc.get_job(Id=job_id)['Job']['Status']
    if job_status == 'COMPLETE':
        break
    if job_status == 'ERROR':
        raise Exception(f'MediaConvert job {job_id} failed')
    time.sleep(10)

# Step 4: Download from S3
s3.download_file('my-output-bucket', 'output/video.mp4', 'video.mp4')

# AFTER: ChangeThisFile (one call, no S3, no IAM)
import requests

response = requests.post(
    'https://changethisfile.com/v1/convert',
    headers={'Authorization': 'Bearer ctf_sk_your_key'},
    files={'file': open('video.mov', 'rb')},
    data={'target': 'mp4'}
)
with open('video.mp4', 'wb') as f:
    f.write(response.content)

The MediaConvert version is ~60 lines across 4 distinct steps. The ChangeThisFile version is 8 lines. You also eliminate the S3 buckets, IAM role, and MediaConvert endpoint discovery that the before code doesn't even show.

Auth and infrastructure migration

  1. Get your CTF key: changethisfile.com/v1/keys/free. Free, no card. Format: ctf_sk_....
  2. Remove boto3 and AWS credentials: Uninstall boto3 from your requirements (if MediaConvert is its only use). Remove AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from your environment — or keep them for other AWS services.
  3. Remove S3 infrastructure: If the input/output S3 buckets exist only for MediaConvert, they can be deleted after migration. (If other services use those buckets, keep them.)
  4. Remove IAM role: The MediaConvert execution role (arn:aws:iam::...role/MediaConvertRole) can be deleted after migration.
  5. Remove endpoint discovery: MediaConvert requires fetching your account-specific endpoint before making API calls. ChangeThisFile's endpoint is always https://changethisfile.com/v1/convert.
  6. Update environment variables: Add CTF_API_KEY=ctf_sk_... to your .env file.

Rollback plan

MediaConvert is pay-per-use — there's no subscription to cancel, and your S3 buckets and IAM role remain until you delete them. Rollback is low-friction:

  1. Keep your S3 buckets, IAM role, and MediaConvert job configuration code in version control. Don't delete infrastructure until you've run ChangeThisFile in production for 30 days.
  2. Route conversions through a function with a backend parameter. Switching back to MediaConvert is a one-variable change.
  3. Compare output file quality and playback compatibility for your actual video content. MediaConvert's H.264 encoder with QVBR produces better quality at equivalent bitrate than FFmpeg's defaults. If quality regression is visible or causes playback issues, revert.
  4. MediaConvert handles very large files (many GB) and long videos efficiently via its distributed infrastructure. ChangeThisFile has file size limits and a 120-second server timeout. Large files or long videos may need to stay on MediaConvert.

Common migration questions

Will video quality be the same?
ChangeThisFile uses FFmpeg with default settings. MediaConvert uses AWS's optimized encoder with QVBR quality-based rate control. For simple format swaps (container change, codec normalization), quality differences are minimal. For quality-sensitive content where specific bitrate targets matter, MediaConvert's encoder gives you more control.

Can ChangeThisFile handle large video files?
Free tier: 25MB. Paid plans support larger files. Most professional video files exceed 25MB. If you regularly convert files larger than a few hundred MB, ensure your CTF plan's upload limit covers your typical file size. Very large files (multi-GB) work better with MediaConvert's distributed architecture.

Does ChangeThisFile work with files already in S3?
No — ChangeThisFile requires direct file upload. If your pipeline stores files in S3, you'll need to download them first before calling ChangeThisFile. This adds a step; for files already in AWS, keeping MediaConvert may be simpler.

What about Lambda-triggered conversions?
You can trigger ChangeThisFile from a Lambda function — download the S3 object in Lambda, POST to ChangeThisFile, write the result to S3. This is more code than MediaConvert's native S3 integration but works if you're trying to escape AWS lock-in.

Does ChangeThisFile support caption/subtitle files (SRT, VTT)?
ChangeThisFile does not process captions or burn subtitles into video. If you use MediaConvert's caption handling, that feature doesn't have an equivalent in ChangeThisFile.

AWS MediaConvert is the right choice when you need it: adaptive streaming, broadcast quality, deep AWS integration. It's overkill for "convert this file." If your MediaConvert usage fits the simple-conversion profile, get a free API key and test your most common conversion before dismantling your S3 and IAM setup.