- 4K WebM video encoded with VP9
2a. 1080p MP4 video encoded with HEVC/H.265
2b. Optional: 1080p MP4 encoded with MPEG-4/H.264 (if Windows Mobile and IE8-11 support is required)
- Given a 250MB 1080p MP4, render an h264 MP4 with AAC audio with final size of 5.5MB playing at 1500Kb/s; allow the video to begin playing before it is completely downloaded by the viewer by passing
-movflags +faststartbrew install ffmpeg --with-libvpx --with-libvorbis --with-fdk-aac --with-opusffmpeg -i source.mp4 -c:v h264 -c:a aac -b:v 1500k -threads 4 -movflags +faststart out.mp4
ffmpeg -i source.mp4 -c:v h264 -b:v 1500k -vf scale=1280:-1 -threads 4 -an out.mp4- Install
brew install ffmpegwith the flags--with-libvpx --with-libvorbisset - Installation time on a 4-core Skylake with 8GB RAM: ~20 minutes
- Example output: given a 450MB 4K MP4, rendered output is a 6MB MP4 with no audio, suitable for video heroes
- Encoding time required: ~4 minutes
- Install
ffmpeg -i <source> -c:v libvpx-vp9 -pass 1 -b:v 1000K -threads 8 -speed 4 -tile-columns 6 -frame-parallel 1 -an -f webm /dev/null && ffmpeg -i <source> -c:v libvpx-vp9 -pass 2 -b:v 1000K -threads 8 -speed 1 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -f webm out.webmffmpeg -i source.mp4 -c:v h264 -b:v 1000k -vf scale=1280:-1 -filter:v "fade=in:st=0:d=1, fade=out:st=9:d=1" -threads 4 -an out.mp4
ffmpeg's installation guide has more information if needed, but the following should be all you need.
Install FFmpeg with homebrew. You'll need to install it with a couple flags for webm and the AAC audio codec.
brew install ffmpeg --with-libvpx --with-libvorbis --with-fdk-aac --with-opusfdk-aac and opus are required for audio. You may omit them if audio is not desired.
If you want a nice set of codecs and tools for post-rendering tasks:
brew install ffmpeg --with-fdk-aac --with-tools --with-freetype --with-libass --with-libvorbis --with-libvpx --with-x265If you want everything ffmpeg has to offer, run:
brew install ffmpeg $(brew options ffmpeg | grep -vE '\s' | grep -- '--with-' | tr '\n' ' ')If you want everything, and if you enjoy making your life difficult, run:
brew install ffmpeg --with-chromaprint --with-fdk-aac --with-fontconfig --with-freetype --with-frei0r --with-game-music-emu --with-libass --with-libbluray --with-libbs2b --with-libcaca --with-libgsm --with-libmodplug --with-librsvg --with-libsoxr --with-libssh --with-libvidstab --with-libvorbis --with-libvpx --with-opencore-amr --with-openh264 --with-openjpeg --with-openssl --with-opus --with-rtmpdump --with-rubberband --with-sdl2 --with-snappy --with-speex --with-tesseract --with-theora --with-tools --with-two-lame --with-wavpack --with-webp --with-x265 --with-xz --with-zeromq --with-zimgIf you already have ffmpeg installed, but not with the audio codecs, use the reinstall command.
brew reinstall ffmpeg --with-opus --with-fdk-aacNote: Java 1.8+ is required to install this formula; Java can be installed with brew cask install java (recommended), or by downloading and installing it yourself.
FFmpeg options. The -c:v option is an alias for -vcodec and -c:a is an alias for -acodec. -crf is Constant Rate Factor.
Refer to ffmpeg's compilation guide for Ubuntu, Debian, or Mint.
In your home directory make a new directory to put all of the source code and binaries into:
mkdir -p ~/ffmpeg_sources ~/binFrom that new directory, run:
sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libx264-dev libx265-dev libnuma-dev libvpx-dev libfdk-aac-dev libopus-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-devRefer to ffmpeg's compilation guide for Windows 10.
When converting to an MP4, keep in mind that Windows Mobile and IE8-11 only support the h264 video and aac audio codecs. If these browsers aren't required, or if videos rendered specifically for Windows Mobile and IE8-11 is a goal, then definitely choose the HEVC/H.265 video codec with aac or mp3 audio codec for maximum compatibility.
Edge 12 supports HEVC/H.265, but it also partially supports VP9. It is suggested that you try various combinations given these facts to see what works best for your video file.
The FFmpeg and H.264 Encoding Guide can walk also you through some of the H.264 specific options.
ffmpeg -i input.mov -vcodec h264 -acodec aac -strict -2 output.mp4For maximum compatibility, use the profile option. This may, however, increase the bit rate quite a bit. You can disable the audio stream with the -an option. -pix_fmt yuv420p is for Apple Quicktime support.
In this example, input.mov is converted to output.mp4 with maximum compatibility, with Quicktime support, and without an audio stream.
ffmpeg -an -i input.mov -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3 output.mp4libvpx is the VP8 video encoder for WebM. FFmpeg and WebM Encoding Guide will walk you through webm specifics.
In this example, input.mov is converted to output.webm with a constant rate factor of 10 (lower is higher quality) at a bitrate of 1M. Changing the bitrate to something lower (e.g. 700K) will result in lower file sizes and lower quality. If the video does not have audio (or if you do not need audio), omit -acodec libvorbis.
ffmpeg -i input.mov -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis output.webmVP9 can encode videos at half the file size. You can check out Google's VP9 encoding guide for their recommend settings or the FFmpeg VP9 guide.
Here's an example from the FFmpeg guide:
ffmpeg -i input.mov -vcodec libvpx-vp9 -b:v 1M -acodec libvorbis output.webmAnd here's Google's "Best Quality (Slowest) Recommended Settings". Run the first line, ignore the resulting warning (that the out.webm is empty; it was output to /dev/null), then run the second line. The video will be output as out.webm.
ffmpeg -i <source> -c:v libvpx-vp9 -pass 1 -b:v 1000K -threads 1 -speed 4 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 25 -g 9999 -aq-mode 0 -an -f webm /dev/null
ffmpeg -i <source> -c:v libvpx-vp9 -pass 2 -b:v 1000K -threads 1 -speed 0 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 25 -g 9999 -aq-mode 0 -c:a libopus -b:a 64k -f webm out.webmAs of January 2015, all major browsers support MP4. Since all browsers support MP4, we can use WebM's VP9 codec for modern browsers and fall back to MP4s for the rest.
Data current as of July 2018. Sources:
- jwplayer's research
- caniuse for MPEG-4/H.264
- caniuse for HEVC/H.265
- caniuse for WebM
| Browser | H264 | H265 | VP8 | VP9 | AAC | MP3 | VORBIS | OPUS |
|---|---|---|---|---|---|---|---|---|
| Chrome for Desktop | 30 | - | 30 | 30 | 30 | 30 | 30 | 33 |
| Chrome for Android | 30 | - | 30 | 30 | 30 | 30 | 30 | - |
| IE | 9 | 101 | - | - | 9 | 9 | - | - |
| IE Mobile | 10 | - | - | - | 10 | 10 | - | - |
| Edge | 12 | 121 | - | 142 | 12 | 12 | - | 14 |
| Firefox for Desktop | 22 | - | 20 | 28 | 22 | 22 | 20 | 20 |
| Firefox for Android | 20 | - | 20 | 28 | 20 | 20 | 20 | 20 |
| Safari for Mac | 3 | 113 | - | - | 3 | 3 | - | - |
| Safari for iOS | 3 | 113 | - | - | 3 | 3 | - | - |
| Opera for Desktop | 25 | - | 11 | 16 | - | - | 11 | 12 |
| Android Stock Browser | 2.3 | - | 4.0 | 5 | 2.3 | 2.3 | 4.0 | - |
| ----------------------- | ------ | ---------------- | ----- | ---------------- | ----- | ----- | -------- | ------ |
- Supported only for devices with hardware support.
- Edge 14+ has partial support for VP9
- Supported only on macOS High Sierra.
This method allows the encoder to attempt to achieve a certain output quality for the whole file when output file size is of less importance. This provides maximum compression efficiency with a single pass. Each frame gets the bitrate it needs to keep the requested quality level. The downside is that you can't tell it to get a specific filesize or not go over a specific size or bitrate.
Since all browsers support MP4, we can use WebM's VP9 codec for modern browsers and fall back to MP4s for the rest.
<video>
<source src="path/to/video.webm" type="video/webm; codecs=vp9,vorbis">
<source src="path/to/video.mp4" type="video/mp4">
</video>The ffmpeg thumbnail guide describes how to output a single frame from the video.
ffmpeg -i input.mp4 -ss 00:00:14.435 -vframes 1 out.pngOutput one image every second as a jpg.
ffmpeg -i input.mp4 -vf fps=1 out%3d.jpgFFmpeg now has a reverse filter. Usage: (source from this video.stackexchange answer)
For video only:
ffmpeg -i input.mp4 -vf reverse reversed.mp4For audio and video:
ffmpeg -i input.mp4 -vf reverse -af areverse reversed.mp4This filter buffers the entire clip. For larger files, segment the file, reverse each segment and then concat the reversed segments.