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
.
This image can be used as a base for an encoding farm.
There are different builds available:
- alpine based images
ffmpeg:<version>-alpine38
orffmpeg:<version>-alpine312
(theffmpeg:<version>-alpine
builds are not updated any more)- alpine based scratch images
ffmpeg:<version>-scratch38
orffmpeg:<version>-scratch312
(experimental image containing only FFmpeg and libraries, theffmpeg:<version>-alpine
builds are not updated any more)
- alpine based scratch images
- centos based images
ffmpeg:<version>-centos7
orffmpeg:<version>-centos8
- ubuntu based images
ffmpeg:<version>-ubuntu1804
orffmpeg:<version>-ubuntu2004
(the default, you can also useffmpeg:<version>-ubuntu
as an alias)- ubuntu based nvidia images
ffmpeg:<version>-nvidia1804
- ubuntu based vaapi images
ffmpeg:<version>-vaapi1804
orffmpeg:<version>-vaapi2004
- ubuntu based nvidia images
<version>
can be one of the following:
- 3.2
- 3.3
- 3.4
- 4.0
- 4.1
- 4.2
- 4.3
- snapshot
Not all combinations are supported and older versions will fade out over time. See the table below for the currently supported combinations.
Version | alpine38 | alpine312 | centos7 | centos8 | nvidia1804 | scratch38 | scratch312 | ubuntu1804 | ubuntu2004 | vaapi1804 | vaapi2004 |
---|---|---|---|---|---|---|---|---|---|---|---|
3.2 | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ | ❌ | ❌ | ✔️ | ❌ | ✔️ |
3.3 | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
3.4 | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
4.0 | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
4.1 | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
4.2 | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
4.3 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
snapshot | ❌ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
You can use the following command to generate a list of current images:
$ curl --silent https://hub.docker.com/v2/repositories/jrottenberg/ffmpeg/tags/?page_size=500 | jq -cr ".results|sort_by(.name)|reverse[]|.sz=(.full_size/1048576|floor|tostring+\"mb\")|[.name,( (20-(.name|length))*\" \" ),.sz,( (8-(.sz|length))*\" \"),.last_updated[:10]]|@text|gsub(\"[,\\\"\\\]\\\[]\";null)"
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.
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 \
-i http://url/to/media.mp4 \
-stats \
$ffmpeg_options - > out.mp4
docker run jrottenberg/ffmpeg -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
docker run -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:3.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. Use the pixel format switch to change the number of bits per pixel by suffixing it with 10 for 10bits or 12 for 12bits.
Let's assume original.gif
is located in the current directory :
docker run -v $(pwd):$(pwd) -w $(pwd)\
jrottenberg/ffmpeg:3.2-scratch -stats \
-i original.gif \
original-converted.mp4
Let's start some process continuously writing some radio music, and listen it:
docker run --rm -d -v $(pwd):$(pwd) -w $(pwd) -p 11235:11235 \
--name radio-writer jrottenberg/ffmpeg \
-i http://radio.casse-tete.solutions/salut-radio-64.mp3 \
-filter_complex '[0:a]volume@vol=1,azmq=bind_address=tcp\\\://0.0.0.0\\\:11235[out]' \
-map '[out]' ./salut-radio.mp3
ffplay ./salut-radio.mp3
Now, just toggle its volume on-fly, and hear how it changes:
docker run --rm --network=host --entrypoint sh jrottenberg/ffmpeg -c \
'echo "volume@vol volume 2" | zmqsend -b tcp://127.0.0.1:11235'
Let's send video.mp4
to srt-listener on port 9000 over SRT protocol.
docker run -v $(pwd):$(pwd) jrottenberg/ffmpeg \
-re -i $(pwd)/video.mp4 -acodec copy -vcodec copy -f mpegts srt://srt-listener:9000?pkt_size=1316
Thanks to qmfrederik for the vaapi ubuntu based variant
jrottenberg/ffmpeg:vaapi or jrottenberg/ffmpeg:${VERSION}-vaapi
- Run the container with the device attached /dev/dri from your host into the container :
docker run --device /dev/dri:/dev/dri -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:vaapi [...]
- Have the Intel drivers up and running on your host. You can run
vainfo
(part of vainfo package on Ubuntu) to determine whether your graphics card has been recognized correctly. - Run ffmpeg with the correct parameters, this is the same as when running ffmpeg natively.
Thanks to ShaulMyplay for the nvidia based variant
Supports nvenc only on all ffmpeg versions, and hardware decoding and scaling on ffmpeg >= 4.0
- Install nvidia latest drivers on host machine.
- Install nvidia-docker on host machine.
- Run container using "--runtime=nvidia" flag and use supported ffmpeg hwaccel options
Hardware encoding only example:
docker run --runtime=nvidia jrottenberg/ffmpeg:2.8-nvidia -i INPUT -c:v nvenc_h264 -preset hq OUTPUT
Full hardware acceleration example:
docker run --runtime=nvidia jrottenberg/ffmpeg:4.1-nvidia -hwaccel cuvid -c:v h264_cuvid -i INPUT -vf scale_npp=-1:720 -c:v h264_nvenc -preset slow OUTPUT
docker run -it --entrypoint='bash' jrottenberg/ffmpeg
for i in ogg amr vorbis theora mp3lame opus vpx xvid fdk x264 x265;do echo $i; find /usr/local/ -name *$i*;done
See Dockerfile-env to update a version
- FFMPEG_VERSION: GNU Lesser General Public License (LGPL) version 2.1
- OGG_VERSION: BSD-style license
- OPENCOREAMR_VERSION: Apache License
- VORBIS_VERSION: BSD-style license
- THEORA_VERSION: BSD-style license
- LAME_VERSION: GNU Lesser General Public License (LGPL) version 2.1
- OPUS_VERSION: BSD-style license
- VPX_VERSION: BSD-style license
- WEBP_VERSION: BSD-style license
- XVID_VERSION: GNU General Public Licence (GPL) version 2
- FDKAAC_VERSION: Liberal but not a license of patented technologies
- FREETYPE_VERSION: GNU General Public License (GPL) version 2
- LIBVIDSTAB_VERSION: GNU General Public License (GPL) version 2
- LIBFRIDIBI_VERSION: GNU General Public License (GPL) version 2
- X264_VERSION: GNU General Public License (GPL) version 2
- X265_VERSION: GNU General Public License (GPL) version 2
- LIBZMQ_VERSION: GNU Lesser General Public License (LGPL) version 3.0
- LIBSRT_VERSION: MPL-2.0
- LIBPNG_VERSION: zlib/libpng License
- LIBARIBB24_VERSION: GNU Lesser General Public License (LGPL) version 2.1 or newer
# Add / fix stuff
${EDITOR} templates/
# Generates the Dockerfile for all variants
./update.py
# Test a specific variant
docker build -t my-build docker-images/VERSION/
# Make sure all variants pass before CI
find ffmpeg/ -name Dockerfile | xargs dirname | parallel --no-notice -j 4 --results logs docker build -t {} {}
Commit the templates files THEN all the generated Dockerfile for a merge request. So it's easier to review the template change.