Created
March 16, 2025 13:25
-
-
Save akahana-1/38f72ecc1621dc767668a43f02ded498 to your computer and use it in GitHub Desktop.
static linked ffmpeg in Docker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FROM ubuntu:20.04 as builder | |
ENV DEBIAN_FRONTEND noninteractive | |
ARG FFMPEG_VERSION="5.1.2" | |
ARG PROCS=4 | |
RUN set -x \ | |
&& apt-get update -qq \ | |
&& apt-get install -y --no-install-recommends \ | |
build-essential \ | |
autoconf \ | |
automake \ | |
libtool \ | |
git \ | |
cmake \ | |
pkg-config \ | |
libfreetype6-dev \ | |
libgnutls28-dev \ | |
libgl1-mesa-dev \ | |
libdrm-dev \ | |
meson \ | |
ninja-build \ | |
yasm \ | |
zlib1g-dev \ | |
libunistring-dev \ | |
libvorbis-dev \ | |
libx265-dev \ | |
texinfo \ | |
curl \ | |
ca-certificates \ | |
&& mkdir -p /tmp/ffmpeg_sources /tmp/ffmpeg_build /root/.bin | |
WORKDIR /tmp/ffmpeg_sources | |
ENV PATH "/root/.bin:$PATH" | |
# get NASM | |
RUN curl -o nasm.tar.xz -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.xz \ | |
&& mkdir nasm \ | |
&& tar --strip-components=1 -xf nasm.tar.xz -C nasm \ | |
&& cd nasm \ | |
&& ./autogen.sh \ | |
&& ./configure --prefix="/tmp/ffmpeg_build" --bindir="/root/.bin" \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get mp3 library (lame) | |
RUN curl -o lame.tar.gz -L https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz/download \ | |
&& mkdir lame \ | |
&& tar --strip-components=1 -xf lame.tar.gz -C lame \ | |
&& cd lame \ | |
&& ./configure --prefix="/tmp/ffmpeg_build" --enable-nasm --disable-shared \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get aac library | |
RUN git clone --depth 1 -b v2.0.2 https://github.com/mstorsjo/fdk-aac \ | |
&& cd fdk-aac \ | |
&& autoreconf -fiv \ | |
&& ./configure --prefix="/tmp/ffmpeg_build" --disable-shared \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get opus library | |
RUN git clone --depth 1 -b v1.3.1 https://github.com/xiph/opus.git \ | |
&& cd opus \ | |
&& ./autogen.sh \ | |
&& ./configure --prefix="/tmp/ffmpeg_build" --disable-shared \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get vorbis library | |
RUN git clone --depth 1 -b v1.3.7 https://github.com/xiph/vorbis \ | |
&& cd vorbis \ | |
&& ./autogen.sh \ | |
&& ./configure --prefix="/tmp/ffmpeg_build" --disable-shared \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get x264 library | |
RUN git -C x264 pull 2> /dev/null || git clone --depth 1 https://code.videolan.org/videolan/x264.git -b stable \ | |
&& cd x264 \ | |
&& PKG_CONFIG_PATH="/tmp/ffmpeg_build" \ | |
./configure --prefix="/tmp/ffmpeg_build" --bindir="/root/.bin" --enable-static --enable-pic \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get x265 library | |
RUN git clone --depth 1 -b 3.5 https://bitbucket.org/multicoreware/x265_git.git x265 \ | |
&& cd x265/build/linux \ | |
&& cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/tmp/ffmpeg_build" \ | |
-DENABLE_SHARED:BOOL=OFF -DSTATIC_LINK_CRT:BOOL=ON \ | |
-DENABLE_CLI:BOOL=OFF -DBUILD_SHARED_LIBS:BOOL=OFF \ | |
../../source \ | |
&& sed -i 's/-lgcc_s/-lgcc_eh/g' x265.pc \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get av1 decode library (dav1d) | |
RUN git clone --depth 1 -b 1.0.0 https://code.videolan.org/videolan/dav1d \ | |
&& mkdir dav1d/build \ | |
&& cd dav1d/build \ | |
&& meson setup -Denable_tools=false \ | |
-Denable_tests=false \ | |
--default-library=static \ | |
--prefix "/tmp/ffmpeg_build" \ | |
--libdir "/tmp/ffmpeg_build/lib" \ | |
.. \ | |
&& ninja -j ${PROCS} \ | |
&& ninja install | |
# get av1 library (svt-av1) | |
RUN git clone --depth 1 -b v1.2.1 https://gitlab.com/AOMediaCodec/SVT-AV1 \ | |
&& mkdir SVT-AV1/build \ | |
&& cd SVT-AV1/build \ | |
&& cmake -G "Unix Makefiles" \ | |
-DCMAKE_INSTALL_PREFIX="/tmp/ffmpeg_build" \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DBUILD_DEC=OFF \ | |
-DBUILD_SHARED_LIBS=OFF \ | |
.. \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get av1 library (aom-av1) | |
# get amf | |
RUN git clone --depth 1 -b 1.4.21 https://github.com/GPUOpen-LibrariesAndSDKs/AMF \ | |
&& cp -r AMF/amf/public/include /tmp/ffmpeg_build/include/AMF | |
# image library | |
# get png library | |
RUN curl -L -o libpng.tar.xz http://prdownloads.sourceforge.net/libpng/libpng-1.6.38.tar.xz \ | |
&& mkdir libpng \ | |
&& tar --strip-components=1 -xf libpng.tar.xz -C libpng \ | |
&& cd libpng \ | |
&& ./configure --prefix="/tmp/ffmpeg_build" --disable-shared --enable-hardware-optimizations \ | |
--disable-dependency-tracking --enable-static \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get hardware accelaration | |
RUN git clone --depth 1 -b v2.16-branch https://github.com/intel/libva.git libva \ | |
&& cd libva \ | |
&& ./autogen.sh \ | |
&& ./configure --prefix="/tmp/ffmpeg_build" --disable-x11 --disable-wayland \ | |
--enable-static --disable-shared --disable-docs \ | |
&& make -j ${PROCS} \ | |
&& make install | |
# get ffmpeg source | |
RUN git clone --depth 1 -b n${FFMPEG_VERSION} https://github.com/FFmpeg/FFmpeg ffmpeg \ | |
&& cd ffmpeg \ | |
&& PKG_CONFIG_PATH="/tmp/ffmpeg_build/lib/pkgconfig" \ | |
./configure \ | |
--prefix="/tmp/ffmpeg_build" \ | |
--pkg-config-flags="--static" \ | |
--extra-cflags="-I/tmp/ffmpeg_build/include" \ | |
--extra-ldflags="-L/tmp/ffmpeg_build/lib" \ | |
--extra-libs="-lpthread -lm -ldl" \ | |
--extra-ldexeflags="-static" \ | |
--bindir="/root/.bin" \ | |
--enable-gpl \ | |
--enable-vaapi \ | |
--enable-libfdk-aac \ | |
--enable-libmp3lame \ | |
--enable-libopus \ | |
--enable-libdav1d \ | |
--enable-libsvtav1 \ | |
--enable-libvorbis \ | |
--enable-libx264 \ | |
--enable-libx265 \ | |
--enable-nonfree \ | |
--enable-small \ | |
--enable-static \ | |
--disable-shared \ | |
--disable-ffplay \ | |
--disable-doc \ | |
--disable-debug \ | |
&& make -j ${PROCS} \ | |
&& make install \ | |
&& hash -r |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment