Ffmpeg
Docker build for FFmpeg on Ubuntu / Alpine / Centos / Scratch / nvidia / vaapi
Install / Use
/learn @jrottenberg/FfmpegREADME
FFmpeg Docker image
This project prepares a minimalist Docker image with FFmpeg. It compiles FFmpeg from sources following instructions from the Compilation Guide.
You can install the latest build of this image by running docker pull jrottenberg/ffmpeg:${VERSION}-${VARIANT} or docker pull ghcr.io/jrottenberg/ffmpeg:${VERSION}-${VARIANT}.
For the latest FFmpeg version on Ubuntu LTS, you can use: docker pull jrottenberg/ffmpeg:latest or docker pull ghcr.io/jrottenberg/ffmpeg:latest.
This image can be used as a base for an encoding farm.
Builds / Available Docker Containers
There are different builds available: Below is a table that provides examples for the nomenclature:
ffmpeg-<version>-<os variant and version>
| image name | OS ver | ffmpeg ver | variant | description
| --- | --- | --- | --- | --- |
| ffmpeg-7.1-ubuntu2404 | 24.04 | 6.x - 7.x | ubuntu | external libraries are installed from os packages, and ffmpeg is built from source. See Ubuntu Compilation Guide for details on this. |
| ffmpeg-7.1-ubuntu2404-edge | 24.04 | 6.x - 7.x | ubuntu | libs and ffmpeg are built from source. See Ubuntu Compilation Guide for details on this. |
| ffmpeg-7.1-vaapi2404 | 24.04 | 6.x - 7.x | ubuntu | like: ubuntu2404 but enables: Video Acceleration API (VAAPI) in ffmpeg |
| ffmpeg-7.1-nvidia2204-edge | 22.04 | 6.x - 7.x | ubuntu | Built w/ NVIDIA's hardware-accelerated encoding and decoding APIs enabled |
| ffmpeg-7.1-alpine320 | 3.20 | 6.x - 7.x | alpine | vendor libs, but ffmpeg is built from source |
| ffmpeg-7.1-scratch | 3.20 | 6.x - 7.x | alpine | vendor libs, and ffmpeg are built from source. Also we make the distro as small as possible by not installing any packages in base and striping symbols of installed libs |
ffmpeg <version> can be one of the following: 6.1, 7.0, 7.1 with the above table.
Note: The current versions of ffmpeg supported are anything newer than 3 years old and not exceeded the end-of-life
<details><summary>Here are some additional older builds</summary>- alpine based images
ffmpeg:<version>-alpineorffmpeg:<version>-alpine313(old versions withffmpeg:<version>-alpine312,ffmpeg:<version>-alpine311)- alpine based scratch images
ffmpeg:<version>-scratchorffmpeg:<version>-scratch313(old versions withffmpeg:<version>-scratch312,ffmpeg:<version>-scratch311)
- alpine based scratch images
- ubuntu based images
ffmpeg:<version>-ubuntuorffmpeg:<version>-ubuntu2004(old versions withffmpeg:<version>-ubuntu1804,ffmpeg:<version>-ubuntu1604)- ubuntu based nvidia images
ffmpeg:<version>-nvidiaorffmpeg:<version>-nvidia2004(old versions withffmpeg:<version>-nvidia1804,ffmpeg:<version>-nvidia1604) - ubuntu based vaapi images
ffmpeg:<version>-vaapi1804orffmpeg:<version>-vaapi2004(old versions withffmpeg:<version>-vaapi1804,ffmpeg:<version>-nvidia1604)
- ubuntu based nvidia images
Philosophy behind the different builds
ubuntu2404 We chose Ubuntu 24.04 because it is the LTS ( Long Term Support ) build of Ubuntu. We used the ffmpeg support libraries from the Ubuntu distrobution where possible. Example: we use 'libx264-dev' as the package to install. We do not tie it to a version. This way when its time to update from 24.04 to 26.04 we can simply update the base Docker template for ubuntu. This will make updating the OS easier as time goes on.
ubuntu2404-edge
This image is just like the above ubuntu2404 container image, except we build all of the ffmpeg support libraries. This is in the spirit of the original intent of this project jrottenberg/ffmpeg alltogether. Building everything that ffmpeg needs, and ffmpeg itself from source. This gives us the most control over all of the details of release. The drawback of this is that its much harder to keep updated. The thought process of having both 'Ubuntu-2404' and 'Ubuntu-2404-edge' is that it makes updating the OS easier over time.
vaapi2404
This release is like also ubuntu2404 but enables: Video Acceleration API (VAAPI) when building ffmpeg
nvidia2204-edge
This release is like also ubuntu2404 but enables: NVIDIA's hardware-accelerated encoding and decoding APIs enabled
alpine320 alpine uses the os vendor libs, but ffmpeg is built from source.
scratch Scratch is also an alpine image. We build the vendor libs, and ffmpeg from source. Also we make the distro as small as possible by not installing any packages in base and striping symbols of installed libs.
Generate list of recent Docker Container Images
You can use the following command to generate a list of current images:
$ python3 -mvenv .venv
$ source .venv/bin/activate
$ pip install requests
$ python3 ./generate-list-of-recent-images.py > list_of_recent_images.txt
$ deactivate
$ rm -rf .venv
$ less list_of_recent_images.txt
If you want to compare the one you have locally, use the following command:
$ docker images | grep ffmpeg | sort | awk '{print $1 ":" $2 "\t" $7 $8}'
Please use Github issues to report any bug or missing feature.
Test
ffmpeg version N-98740-ga72d529 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --enable-vaapi --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil 56. 58.100 / 56. 58.100
libavcodec 58.100.100 / 58.100.100
libavformat 58. 51.100 / 58. 51.100
libavdevice 58. 11.101 / 58. 11.101
libavfilter 7. 87.100 / 7. 87.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
configuration:
--disable-debug
--disable-doc
--disable-ffplay
--enable-shared
--enable-avresample
--enable-libopencore-amrnb
--enable-libopencore-amrwb
--enable-gpl
--enable-libass
--enable-fontconfig
--enable-libfreetype
--enable-libvidstab
--enable-libmp3lame
--enable-libopus
--enable-libtheora
--enable-libvorbis
--enable-libvpx
--enable-libwebp
--enable-libxcb
--enable-libx265
--enable-libxvid
--enable-libx264
--enable-nonfree
--enable-openssl
--enable-libfdk_aac
--enable-postproc
--enable-small
--enable-version3
--enable-libbluray
--enable-libzmq
--extra-libs=-ldl
--prefix=/opt/ffmpeg
--enable-libopenjpeg
--enable-libkvazaar
--enable-libaom
--extra-libs=-lpthread
--enable-libsrt
--enable-libaribb24
--enable-vaapi
--extra-cflags=-I/opt/ffmpeg/include
--extra-ldflags=-L/opt/ffmpeg/lib
Capture output from the container to the host running the command
docker run jrottenberg/ffmpeg:4.4-alpine \
-i http://url/to/media.mp4 \
-stats \
$ffmpeg_options - > out.mp4
Examples
Extract 5s @00:49:42 into a GIF
docker run jrottenberg/ffmpeg:4.4-alpine -stats \
-i http://archive.org/download/thethreeagesbusterkeaton/Buster.Keaton.The.Three.Ages.ogv \
-loop 0 \
-final_delay 500 -c:v gif -f gif -ss 00:49:42 -t 5 - > trow_ball.gif
Convert 10bits MKV into a 10Bits MP4
docker run -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:4.4-scratch \
-stats \
-i http://www.jell.yfish.us/media/jellyfish-20-mbps-hd-hevc-10bit.mkv \
-c:v libx265 -pix_fmt yuv420p10 \
-t 5 -f mp4 test.mp4
The image has been compiled with [X265 Multilib](https://x265.readthedocs.io/en/default/api.html#
