IAnswerable

Video Hosting Options for Small Products

29 Jul 2026

Don’t build a video pipeline yourself unless you have a specific reason to. Video is the one media type where the hosted options are cheap enough, and the self-hosted version is painful enough, that “just use a service” is the right call for almost everyone.

Self-hosted: ffmpeg, S3, and HLS

The DIY version: transcode uploads with ffmpeg into multiple bitrates, package as HLS, store the segments in object storage, serve through a CDN.

ffmpeg -i input.mp4 \
  -filter_complex "[0:v]split=3[v1][v2][v3]; \
  [v1]scale=w=1920:h=1080[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=854:h=480[v3out]" \
  -map "[v1out]" -c:v:0 h264 -b:v:0 5M \
  -map "[v2out]" -c:v:1 h264 -b:v:1 3M \
  -map "[v3out]" -c:v:2 h264 -b:v:2 1M \
  -map a:0 -map a:0 -map a:0 -c:a aac \
  -f hls -hls_time 6 -hls_playlist_type vod \
  -master_pl_name master.m3u8 \
  -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
  stream_%v.m3u8

This is real, working ffmpeg — and it’s also the easy part. The hard part is everything around it: a worker queue that doesn’t fall over on a large upload, retry logic for failed transcodes, adaptive bitrate switching that actually works across devices, thumbnail generation, and DRM or signed playback URLs if the content needs protection. You’re also on the hook for the transcoding compute itself, which is CPU-heavy and spiky — cheap at low volume, expensive to provision for at scale.

Do this only if you have very high volume (enough that the per-minute cost of a hosted service is a real line item) or a requirement a hosted service won’t meet — a specific codec, on-prem/air-gapped storage, or a compliance boundary that rules out a third party touching the content.

Cloudflare Stream

Upload, and Cloudflare handles transcoding, adaptive bitrate, and delivery through their CDN. Pricing is per-minute-stored plus per-minute-delivered, which is predictable and scales down cleanly for a small product — you’re not paying for infrastructure you’re not using yet. Playback is a drop-in player or an iframe embed. It’s the lowest-effort option if you’re already on Cloudflare for DNS or other services, and it’s usually the cheapest hosted option at low-to-moderate volume.

Mux

Purpose-built for video, with better analytics (real playback data — rebuffering, quality switches, watch time) and more encoding control than Cloudflare offers. It costs more per minute, but the analytics and the API are meaningfully more mature if video is core to your product rather than incidental to it — a course platform or a video-first social product, not a SaaS app with an occasional demo video.

The comparison

Self-hosted Cloudflare Stream Mux
Setup effort High Low Low
Ongoing ops You own it None None
Cost at low volume Compute + storage, fixed Cheapest Higher
Cost at high volume Cheapest if optimized Scales linearly Scales linearly
Analytics Build it yourself Basic Strong
Codec/DRM control Full Limited Good

The call

Start with Cloudflare Stream or Mux — pick Cloudflare if you’re cost-sensitive and video is a supporting feature, pick Mux if video is the product and you need real playback analytics. Don’t build the ffmpeg pipeline until a hosted service’s bill or its limitations have actually become a problem you can point to. Video infrastructure is exactly the kind of thing that’s fun to build and expensive to maintain, and most products never need to own it.