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}
.
This image can be used as a base for an encoding farm.
Builds / Avaliabvle Docker ContainersThere are different builds available: Below is a table that provides examples for the nomenclature:
ffmpeg-<version>-<os variant and version>
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
Here are some additional older buildsffmpeg:<version>-alpine
or ffmpeg:<version>-alpine313
(old versions with ffmpeg:<version>-alpine312
, ffmpeg:<version>-alpine311
)
ffmpeg:<version>-scratch
or ffmpeg:<version>-scratch313
(old versions with ffmpeg:<version>-scratch312
, ffmpeg:<version>-scratch311
)ffmpeg:<version>-ubuntu
or ffmpeg:<version>-ubuntu2004
(old versions with ffmpeg:<version>-ubuntu1804
, ffmpeg:<version>-ubuntu1604
)
ffmpeg:<version>-nvidia
or ffmpeg:<version>-nvidia2004
(old versions with ffmpeg:<version>-nvidia1804
, ffmpeg:<version>-nvidia1604
)ffmpeg:<version>-vaapi1804
or ffmpeg:<version>-vaapi2004
(old versions with ffmpeg:<version>-vaapi1804
, ffmpeg:<version>-nvidia1604
)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 ImagesYou 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.
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.mp4Extract 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.gifConvert 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. Use the pixel format switch to change the number of bits per pixel by suffixing it with 10 for 10bits or 12 for 12bits.
Convert a local GIF into a mp4Let's assume original.gif
is located in the current directory :
docker run -v $(pwd):$(pwd) -w $(pwd)\ jrottenberg/ffmpeg:4.4-scratch -stats \ -i original.gif \ original-converted.mp4Use ZeroMQ to toggle filter value on-fly
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:4.4-alpine \ -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 docker run -it -v $(pwd):$(pwd) -w $(pwd) --entrypoint=ffprobe jrottenberg/ffmpeg:4.4-alpine -v quiet -show_streams salut-radio.mp3
Now, just toggle its volume on-fly, and hear how it changes:
docker run --rm --network=host --entrypoint sh jrottenberg/ffmpeg:4.4-ubuntu -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:4.4-centos \ -re -i $(pwd)/video.mp4 -acodec copy -vcodec copy -f mpegts srt://srt-listener:9000?pkt_size=1316Use hardware acceleration enabled build
Thanks to qmfrederik for the vaapi ubuntu based variant
jrottenberg/ffmpeg:vaapi or jrottenberg/ffmpeg:${VERSION}-vaapi
docker run --device /dev/dri:/dev/dri -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:4.4-vaapi [...]
vainfo
(part of vainfo package on Ubuntu) to determine whether your graphics card has been recognized correctly.Thanks to ShaulMyplay for the nvidia based variant
Supports nvenc only on all ffmpeg versions, and hardware decoding and scaling on ffmpeg >= 4.0
Hardware encoding only example:
docker run --runtime=nvidia jrottenberg/ffmpeg:4.4-nvidia -i INPUT -c:v nvenc_h264 -preset hq OUTPUT
Full hardware acceleration example: docker run --runtime=nvidia jrottenberg/ffmpeg:4.4-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:7.1-ubuntu2404 for i in ogg amr vorbis theora mp3lame opus vpx xvid fdk x264 x265;do echo $i; find /usr/local/ -name *$i*;done
Libs are in /lib
in alpine.
docker run -it --entrypoint='sh' jrottenberg/ffmpeg:7.1-alpine320 for i in ogg amr vorbis theora mp3lame opus vpx xvid fdk x264 x265;do echo $i; find /lib/ -name *$i*;doneFFMPEG Supported Libraries
The following libraries are used by FFMPEG. The version number and release date are provided along with the license information. These version numbers are for the lib source builds, which are 'ubuntu2404-edge' and 'foo'. These libs are included in the package images as well, but the version numbers might vary slightly.
See generate-source-of-truth-ffmpeg-versions.py
to update a version
The following libraries are used by FFMPEG. The version number and release date are provided along with the license information. These version numbers are for the lib source builds, which are 'ubuntu2404-edge' and 'foo'. These libs are included in the package images as well, but the version numbers might vary slightly.
Those docker images use code of FFmpeg licensed under the LGPLv2.1 and their source can be downloaded on github.com/jrottenberg/ffmpeg.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4