Note: This answer is probably not what you need, and it has been heavily edited since its original posting in 2012. It's 2022 now; streaming works differently than it used to. This guide assumes simple progressive download of one video file at one given resolution, e.g. 1080p – no adaptive streaming. If you need adaptive streaming (MPEG-DASH or HLS), please search for other guides.
First off, make sure to download a recent
ffmpeg version (download a static build; don't call
apt-get install ffmpeg or similar).
To generate videos supported by the most browsers, always check the latest compatibility table. The most common supported video codecs and containers are:
- H.264 or H.265 video in an MP4 container
- VP9 or AV1 video in a WebM/MKV container
As H.264 and VP9 are faster to encode, this answer will only focus on them. To use the other codecs (H.265, AV1), check the FFmpeg Wiki Encoding Guides.
WebM (VP9 / Vorbis)
Follow the recommendations in the FFmpeg VP9 guide and use a two-pass encoding approach with rate constraints:
ffmpeg -y -i input-c:v libvpx-vp9 -b:v 2000k -minrate 500k -maxrate 2500k -c:a libopus -pass 1 -f webm /dev/null && \
ffmpeg -i input-c:v libvpx-vp9 -b:v 2000k -minrate 500k -maxrate 2500k -c:a libopus -pass 2 output.webm
The target bitrate depends on your resolution, frame rate, the type of content, and what quality you want. 2.5 MBit/s should be a good compromise for HD video at 30 fps. See this Google guide for some recommendations.
MP4 (H.264 / AAC)
Follow the recommendations in the FFmpeg H.264 guide and use a two-pass encoding approach with rate constraints. The 2-pass bitrate approach is preferred for streaming-type applications:
ffmpeg -y -i input -c:v libx264 -b:v 5000k -minrate 1000k -maxrate 8000k -pass 1 -an -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -b:v 5000k -minrate 1000k -maxrate 8000k -pass 2 -c:a aac -b:a 192k -movflags faststart output.mp4
Here, the target bitrate should be about 50% higher than for VP9 video, as H.264 is not that efficient. Add the
-movflags faststart option to the second pass to make initial loading of the video faster.
For setting audio options, see the AAC encoding guide.