Video Hosting Options for Small Products
29 Jul 2026Don’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.