Architecture
S3 upload triggers Lambda function → Transcode video with FFmpeg → Output multiple resolutions → HLS manifest
Implementation
Lambda Function
import boto3
import subprocess
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# Download from S3
s3.download_file(bucket, key, '/tmp/input.mp4')
# Transcode using FFmpeg
subprocess.run([
'ffmpeg', '-i', '/tmp/input.mp4',
'-vf', 'scale=1920:1080', '/tmp/1080p.mp4',
'-vf', 'scale=1280:720', '/tmp/720p.mp4',
'-vf', 'scale=854:480', '/tmp/480p.mp4'
])
# Upload back to S3
for resolution in ['1080p', '720p', '480p']:
s3.upload_file(f'/tmp/{resolution}.mp4', bucket, f'transcoded/{resolution}.mp4')
Optimizations
- Parallel Processing: Each resolution in separate Lambda
- FFmpeg Tuning: Hardware acceleration when available
- Chunked Upload: Stream output directly to S3
Cost Analysis
- $0.05 per video minute transcoded
- 80% cheaper than traditional EC2 fleet
- Auto-scales to handle traffic spikes