SkillAgentSearch skills...

Ffmpeg

Docker build for FFmpeg on Ubuntu / Alpine / Centos / Scratch / nvidia / vaapi

Install / Use

/learn @jrottenberg/Ffmpeg
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

FFmpeg Docker image

Docker Stars Docker pulls Docker Automated build Github Container Registry Images gitlab pipeline status Azure Build Status

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>-alpine or ffmpeg:<version>-alpine313 (old versions with ffmpeg:<version>-alpine312 , ffmpeg:<version>-alpine311)
    • alpine based scratch images ffmpeg:<version>-scratch or ffmpeg:<version>-scratch313 (old versions with ffmpeg:<version>-scratch312 , ffmpeg:<version>-scratch311)
  • ubuntu based images ffmpeg:<version>-ubuntu or ffmpeg:<version>-ubuntu2004 (old versions with ffmpeg:<version>-ubuntu1804 , ffmpeg:<version>-ubuntu1604)
    • ubuntu based nvidia images ffmpeg:<version>-nvidia or ffmpeg:<version>-nvidia2004 (old versions with ffmpeg:<version>-nvidia1804, ffmpeg:<version>-nvidia1604)
    • ubuntu based vaapi images ffmpeg:<version>-vaapi1804 or ffmpeg:<version>-vaapi2004 (old versions with ffmpeg:<version>-vaapi1804, ffmpeg:<version>-nvidia1604)
</details>

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#

View on GitHub
GitHub Stars1.6k
CategoryDevelopment
Updated22h ago
Forks486

Languages

Python

Security Score

100/100

Audited on Mar 31, 2026

No findings