Strip to amd64-only and adapt for Gitea Actions
Some checks failed
Build FFmpeg Image / Build amd64 image (push) Has been cancelled

Remove arm32v7 and arm64 Dockerfiles (only need amd64 for jazz).
Replace GitHub Actions multi-platform workflow with Gitea Actions
workflow targeting Gitea container registry. Add CLAUDE.md project
docs and update README for fork context.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 00:13:34 +01:00
parent 0454f6a689
commit 7df538e14e
6 changed files with 102 additions and 1072 deletions

View File

@@ -0,0 +1,41 @@
name: Build FFmpeg Image
on:
workflow_dispatch:
push:
branches:
- main
env:
REGISTRY: 192.168.1.95:3000
IMAGE_NAME: timothy/ersatztv-ffmpeg
RELEASE_VERSION: 7.1.1
jobs:
build:
name: Build amd64 image
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Gitea registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./images/linux/amd64/Dockerfile
push: ${{ github.ref == 'refs/heads/main' }}
platforms: linux/amd64
tags: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }}
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest

View File

@@ -1,132 +0,0 @@
name: Docker Publish Multi-Platform
on:
workflow_dispatch:
pull_request:
push:
branches:
- main
env:
REGISTRY: ghcr.io
IMAGE_NAME: ghcr.io/ersatztv/ersatztv-ffmpeg
RELEASE_VERSION: 7.1.1
jobs:
build:
name: Build Docker Images
runs-on: ${{ matrix.os }}
if: contains(github.event.head_commit.message, '[no build]') == false
strategy:
fail-fast: false
matrix:
include:
- name: amd64
platform: linux/amd64
os: ubuntu-latest
- name: arm64
platform: linux/arm64
os: ubuntu-24.04-arm
- name: arm32v7
platform: linux/arm/v7
os: ubuntu-latest
steps:
- name: Clean tools folder
run: cd /opt && find . -maxdepth 1 -mindepth 1 '!' -path ./containerd '!' -path ./actionarchivecache '!' -path ./runner '!' -path ./runner-cache -exec rm -rf '{}' ';'
- name: Checkout
uses: actions/checkout@v4
- name: Prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
- name: Login to container registry
uses: docker/login-action@v3
if: ${{ github.ref == 'refs/heads/main' }}
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
context: .
file: ./images/${{ matrix.platform }}/Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: ${{ matrix.platform }}
push: ${{ github.ref == 'refs/heads/main' }}
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ env.IMAGE_NAME }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=${{ github.ref == 'refs/heads/main' }}
- name: Export digest
if: ${{ github.ref == 'refs/heads/main' }}
run: |
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
if: ${{ github.ref == 'refs/heads/main' }}
uses: actions/upload-artifact@v4
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
merge:
if: ${{ github.ref == 'refs/heads/main' }}
runs-on: ubuntu-latest
needs:
- build
steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
path: ${{ runner.temp }}/digests
pattern: digests-*
merge-multiple: true
- name: Login to container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
tags: |
type=semver,pattern={{version}},value=${{ env.RELEASE_VERSION }}
type=raw,value=latest
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.IMAGE_NAME }}@sha256:%s ' *)
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}

43
CLAUDE.md Normal file
View File

@@ -0,0 +1,43 @@
# ErsatzTV FFmpeg
Custom FFmpeg Docker image used as the base for ErsatzTV containers. Forked from [ErsatzTV/ErsatzTV-ffmpeg](https://github.com/ErsatzTV/ErsatzTV-ffmpeg) after upstream archival (Feb 2026).
## Project Structure
```
images/linux/amd64/Dockerfile # The main (and only) Dockerfile
.gitea/workflows/build.yml # Gitea Actions workflow
```
## How It Works
Single-stage compile of FFmpeg 7.1.1 from source on Ubuntu Noble (`ghcr.io/linuxserver/baseimage-ubuntu:noble`). The Dockerfile:
1. Installs build deps + Intel GPU SDK + CUDA toolkit
2. Compiles ~30 libraries from source (x264, x265, aom, dav1d, libass, etc.)
3. Compiles FFmpeg with all libraries linked
4. Copies only runtime artifacts (ffmpeg/ffprobe binaries + shared libs) into a clean runtime stage
5. Installs runtime GPU drivers (Intel compute-runtime, Mesa, VAAPI/VDPAU/Vulkan)
## Library Versions
All pinned via ENV vars at the top of the Dockerfile. To bump a library version, update the corresponding ENV var and rebuild.
## Build
```bash
# Local build (takes 20-30 minutes)
docker build -f images/linux/amd64/Dockerfile -t ersatztv-ffmpeg:7.1.1 .
```
## Deployment
- Built image is pushed to Gitea registry as `192.168.1.95:3000/timothy/ersatztv-ffmpeg:7.1.1`
- Referenced by ErsatzTV's `docker/Dockerfile` as the `runtime-base` stage
- Only amd64 — jazz (192.168.1.99) is x86_64
## Conventions
- Keep all library versions pinned and explicit
- Test FFmpeg binary works before pushing: `docker run --rm ersatztv-ffmpeg:7.1.1 -version`
- When bumping FFmpeg or library versions, update RELEASE_VERSION in `.gitea/workflows/build.yml`

View File

@@ -1,5 +1,21 @@
# ErsatzTV FFmpeg
This repo contains docker images that are used by [ErsatzTV](https://github.com/ErsatzTV/ErsatzTV).
Custom FFmpeg Docker image for [ErsatzTV](http://192.168.1.95:3000/timothy/ersatztv). Forked from [ErsatzTV/ErsatzTV-ffmpeg](https://github.com/ErsatzTV/ErsatzTV-ffmpeg) (archived upstream).
Images are modified versions of those found at [jrottenberg/ffmpeg](https://github.com/jrottenberg/ffmpeg) and [linuxserver/docker-ffmpeg](https://github.com/linuxserver/docker-ffmpeg).
Built for amd64 only. Images are modified versions of those found at [jrottenberg/ffmpeg](https://github.com/jrottenberg/ffmpeg) and [linuxserver/docker-ffmpeg](https://github.com/linuxserver/docker-ffmpeg).
## What's included
FFmpeg 7.1.1 compiled from source with:
- **NVIDIA**: CUDA 11.4, NVENC/NVDEC/CUVID
- **Intel QSV**: oneVPL, iHD driver 25.1.4
- **VAAPI/VDPAU/Vulkan**: full hardware acceleration stack
- **Codecs**: x264, x265 4.1, AV1 (aom + dav1d), VP8/VP9, AAC (fdk-aac), Opus, and more
- **Subtitles**: libass, fontconfig, freetype, fribidi
- **Dolby Vision**: libdovi 2.2.0
## Build
```bash
docker build -f images/linux/amd64/Dockerfile -t ersatztv-ffmpeg:7.1.1 .
```

View File

@@ -1,466 +0,0 @@
ARG BASE_IMAGE=ghcr.io/linuxserver/baseimage-ubuntu
ARG BASE_IMAGE_TAG=arm32v7-jammy-05e08486-ls73
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS devel-base
ENV DEBIAN_FRONTEND="noninteractive"
ENV MAKEFLAGS="-j4"
ENV AOM=v3.12.0 \
FDKAAC=2.0.3 \
FFMPEG_HARD=7.1.1 \
FONTCONFIG=2.16.0 \
FREETYPE=2.13.3 \
FRIBIDI=1.0.16 \
KVAZAAR=2.3.1 \
LAME=3.100 \
LIBASS=0.17.3 \
LIBDAV1D=1.5.1 \
LIBSRT=1.5.4 \
LIBVIDSTAB=1.1.0 \
LIBWEBP=1.5.0 \
OGG=1.3.5 \
OPENCOREAMR=0.1.6 \
OPENJPEG=2.5.3 \
OPUS=1.5.2 \
THEORA=1.1.1 \
VORBIS=1.3.7 \
VPX=1.15.0 \
X265=3.4 \
XVID=1.3.7
RUN apt-get -yqq update && \
apt-get -yq --no-install-recommends install -y \
autoconf \
automake \
bzip2 \
ca-certificates \
cmake \
curl \
diffutils \
expat \
g++ \
gcc \
git \
gperf \
libexpat1-dev \
libxext-dev \
libgcc-9-dev \
libgomp1 \
libharfbuzz-dev \
libpciaccess-dev \
libssl-dev \
libtool \
libv4l-dev \
libx11-dev \
libxcb-shape0-dev \
libxml2-dev \
make \
meson \
nasm \
ninja-build \
patch \
perl \
pkg-config \
python3 \
python3-pip\
python3-setuptools \
python3-wheel \
x11proto-xext-dev \
xserver-xorg-dev \
xz-utils \
yasm \
zlib1g-dev && \
apt-get autoremove -y && \
apt-get clean -y
# aom
RUN mkdir -p /tmp/aom && \
git clone \
--branch ${AOM} \
--depth 1 https://aomedia.googlesource.com/aom \
/tmp/aom
RUN cd /tmp/aom && \
rm -rf \
CMakeCache.txt \
CMakeFiles && \
mkdir -p \
aom_build && \
cd aom_build && \
cmake \
-DAOM_TARGET_CPU=generic \
-DBUILD_STATIC_LIBS=0 .. && \
make && \
make install
# dav1d
RUN mkdir -p /tmp/dav1d && \
git clone \
--branch ${LIBDAV1D} \
--depth 1 https://github.com/videolan/dav1d.git \
/tmp/dav1d
RUN mkdir /tmp/dav1d/build && cd /tmp/dav1d/build && \
meson setup -Denable_tools=false -Denable_tests=false --libdir /usr/local/lib .. && \
ninja && \
ninja install
# fdk-aac
RUN mkdir -p /tmp/fdk-aac && \
curl -Lf \
https://github.com/mstorsjo/fdk-aac/archive/v${FDKAAC}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/fdk-aac
RUN cd /tmp/fdk-aac && \
autoreconf -fiv && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# freetype
RUN mkdir -p /tmp/freetype && \
curl -Lf \
https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/freetype
RUN cd /tmp/freetype && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# fontconfig
RUN mkdir -p /tmp/fontconfig && \
curl -Lf \
https://www.freedesktop.org/software/fontconfig/release/fontconfig-${FONTCONFIG}.tar.xz | \
tar -Jx --strip-components=1 -C /tmp/fontconfig
RUN cd /tmp/fontconfig && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# fribidi
RUN mkdir -p /tmp/fribidi && \
curl -Lf \
https://github.com/fribidi/fribidi/archive/v${FRIBIDI}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/fribidi
RUN cd /tmp/fribidi && \
./autogen.sh && \
./configure \
--disable-static \
--enable-shared && \
make -j 1 && \
make install
# kvazaar
RUN mkdir -p /tmp/kvazaar && \
curl -Lf \
https://github.com/ultravideo/kvazaar/archive/v${KVAZAAR}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/kvazaar
RUN cd /tmp/kvazaar && \
./autogen.sh && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# lame
RUN mkdir -p /tmp/lame && \
curl -Lf \
http://downloads.sourceforge.net/project/lame/lame/3.100/lame-${LAME}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/lame
RUN cd /tmp/lame && \
cp \
/usr/share/automake-1.16/config.guess \
config.guess && \
cp \
/usr/share/automake-1.16/config.sub \
config.sub && \
./configure \
--disable-frontend \
--disable-static \
--enable-nasm \
--enable-shared && \
make && \
make install
# libass
RUN mkdir -p /tmp/libass && \
curl -Lf \
https://github.com/libass/libass/archive/${LIBASS}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/libass
RUN cd /tmp/libass && \
./autogen.sh && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# libsrt
RUN mkdir -p /tmp/libsrt && \
curl -Lf \
https://github.com/Haivision/srt/archive/v${LIBSRT}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/libsrt
RUN cd /tmp/libsrt && \
cmake . && \
make && \
make install
# libwebp
RUN mkdir -p /tmp/libwebp && \
curl -Lf \
https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${LIBWEBP}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/libwebp
RUN cd /tmp/libwebp && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# ogg
RUN mkdir -p /tmp/ogg && \
curl -Lf \
http://downloads.xiph.org/releases/ogg/libogg-${OGG}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/ogg
RUN cd /tmp/ogg && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# opencore-amr
RUN mkdir -p /tmp/opencore-amr && \
curl -Lf \
http://downloads.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-${OPENCOREAMR}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/opencore-amr
RUN cd /tmp/opencore-amr && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# openjpeg
RUN mkdir -p /tmp/openjpeg && \
curl -Lf \
https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/openjpeg
RUN cd /tmp/openjpeg && \
rm -Rf \
thirdparty/libpng/* && \
curl -Lf \
https://download.sourceforge.net/libpng/libpng-1.6.37.tar.gz | \
tar -zx --strip-components=1 -C thirdparty/libpng/ && \
cmake \
-DBUILD_STATIC_LIBS=0 \
-DBUILD_THIRDPARTY:BOOL=ON . && \
make && \
make install
# opus
RUN mkdir -p /tmp/opus && \
curl -Lf \
https://downloads.xiph.org/releases/opus/opus-${OPUS}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/opus
RUN cd /tmp/opus && \
autoreconf -fiv && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# theora
RUN mkdir -p /tmp/theora && \
curl -Lf \
http://downloads.xiph.org/releases/theora/libtheora-${THEORA}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/theora
RUN cd /tmp/theora && \
cp \
/usr/share/automake-1.16/config.guess \
config.guess && \
cp \
/usr/share/automake-1.16/config.sub \
config.sub && \
curl -fL \
'https://gitlab.xiph.org/xiph/theora/-/commit/7288b539c52e99168488dc3a343845c9365617c8.diff' \
> png.patch && \
patch ./examples/png2theora.c < png.patch && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# vid.stab
RUN mkdir -p /tmp/vid.stab && \
curl -Lf \
https://github.com/georgmartius/vid.stab/archive/v${LIBVIDSTAB}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/vid.stab
RUN cd /tmp/vid.stab && \
echo "" > \
CMakeModules/FindSSE.cmake && \
cmake . && \
make && \
make install
# vorbis
RUN mkdir -p /tmp/vorbis && \
curl -Lf \
http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/vorbis
RUN cd /tmp/vorbis && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# vpx
RUN mkdir -p /tmp/vpx && \
curl -Lf \
https://github.com/webmproject/libvpx/archive/v${VPX}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/vpx
RUN cd /tmp/vpx && \
LDFLAGS=-mfloat-abi=hard ./configure \
--disable-debug \
--disable-docs \
--disable-examples \
--disable-install-bins \
--disable-static \
--disable-unit-tests \
--enable-pic \
--enable-shared \
--enable-vp8 \
--enable-vp9 \
--enable-vp9-highbitdepth \
--extra-cflags="-mfloat-abi=hard" \
--extra-cxxflags="-mfloat-abi=hard" && \
make && \
make install
# x264
RUN mkdir -p /tmp/x264 && \
git clone --branch stable --depth 1 https://github.com/mirror/x264 /tmp/x264
RUN cd /tmp/x264 && \
./configure \
--disable-cli \
--disable-static \
--enable-pic \
--enable-shared && \
make && \
make install
# x265
RUN mkdir -p /tmp/x265 && \
curl -Lf \
http://anduin.linuxfromscratch.org/BLFS/x265/x265_${X265}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/x265
RUN cd /tmp/x265/build/linux && \
curl -fL \
https://sources.debian.org/data/main/x/x265/3.4-2/debian/patches/0001-Fix-arm-flags.patch \
> arm.patch && \
patch ../../source/CMakeLists.txt < arm.patch && \
cmake \
-D ENABLE_ASSEMBLY=OFF \
-D ENABLE_CLI=OFF \
-G "Unix Makefiles" ../../source && \
make && \
make install
# xvid
RUN mkdir -p /tmp/xvid && \
curl -Lf \
https://downloads.xvid.com/downloads/xvidcore-${XVID}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/xvid
RUN cd /tmp/xvid/build/generic && \
./configure && \
make && \
make install
# ffmpeg
RUN if [ -z ${FFMPEG_VERSION+x} ]; then \
FFMPEG=${FFMPEG_HARD}; \
else \
FFMPEG=${FFMPEG_VERSION}; \
fi && \
mkdir -p /tmp/ffmpeg && \
echo "https://ffmpeg.org/releases/ffmpeg-${FFMPEG}.tar.bz2" && \
curl -Lf \
https://ffmpeg.org/releases/ffmpeg-${FFMPEG}.tar.bz2 | \
tar -jx --strip-components=1 -C /tmp/ffmpeg
RUN cd /tmp/ffmpeg && \
./configure \
--disable-debug \
--disable-doc \
--disable-ffplay \
--enable-ffprobe \
--enable-fontconfig \
--enable-gpl \
--enable-libaom \
--enable-libdav1d \
--enable-libass \
--enable-libfdk_aac \
--enable-libfreetype \
--enable-libkvazaar \
--enable-libmp3lame \
--enable-libopencore-amrnb \
--enable-libopencore-amrwb \
--enable-libopenjpeg \
--enable-libopus \
--enable-libsrt \
--enable-libtheora \
--enable-libv4l2 \
--enable-libvidstab \
--enable-libvorbis \
--enable-libvpx \
--enable-libwebp \
--enable-libxml2 \
--enable-libx264 \
--enable-libx265 \
--enable-libxvid \
--enable-nonfree \
--enable-openssl \
--enable-small \
--enable-stripping \
--enable-version3 \
--extra-libs=-ldl \
--extra-libs=-lpthread && \
make
RUN ldconfig && \
mkdir -p /buildout/usr/local/bin && \
cp \
/tmp/ffmpeg/ffmpeg \
/buildout/usr/local/bin && \
cp \
/tmp/ffmpeg/ffprobe \
/buildout/usr/local/bin && \
mkdir -p /buildout/usr/lib && \
ldd /tmp/ffmpeg/ffmpeg \
| awk '/local/ {print $3}' \
| xargs -i cp -L {} /buildout/usr/lib/
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS runtime-base
ENV MAKEFLAGS="-j4"
RUN apt-get -yqq update && \
DEBIAN_FRONTEND="noninteractive" apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 libharfbuzz-bin libxml2 libxcb-shape0 libv4l-0 \
&& apt autoremove -y \
&& rm -rf /var/lib/apt/lists/*
COPY --from=devel-base /buildout/ /
RUN apt-get update && \
apt-get install -y libicu-dev tzdata fontconfig fonts-noto-core fonts-noto-cjk libgdiplus libdrm2 && \
rm -rf /var/lib/apt/lists/*
CMD ["--help"]
ENTRYPOINT ["ffmpeg"]

View File

@@ -1,472 +0,0 @@
ARG BASE_IMAGE=ghcr.io/linuxserver/baseimage-ubuntu
ARG BASE_IMAGE_TAG=arm64v8-noble
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS devel-base
ENV DEBIAN_FRONTEND="noninteractive"
ENV MAKEFLAGS="-j4"
ENV AOM=v3.12.0 \
FDKAAC=2.0.3 \
FFMPEG_HARD=7.1.1 \
FONTCONFIG=2.16.0 \
FREETYPE=2.13.3 \
FRIBIDI=1.0.16 \
KVAZAAR=2.3.1 \
LAME=3.100 \
LIBASS=0.17.3 \
LIBDAV1D=1.2.1 \
LIBSRT=1.5.4 \
LIBVIDSTAB=1.1.1 \
LIBWEBP=1.5.0 \
OGG=1.3.5 \
OPENCOREAMR=0.1.6 \
OPENJPEG=2.5.3 \
OPUS=1.5.2 \
THEORA=1.1.1 \
VORBIS=1.3.7 \
VPX=1.15.0 \
X265=3.3 \
XVID=1.3.7 \
ZIMG=3.0.5
RUN apt-get -yqq update && \
apt-get -yq --no-install-recommends install -y \
autoconf \
automake \
bzip2 \
ca-certificates \
cmake \
curl \
diffutils \
expat \
g++ \
gcc \
git \
gperf \
libexpat1-dev \
libxext-dev \
libgcc-9-dev \
libgomp1 \
libharfbuzz-dev \
libpciaccess-dev \
libssl-dev \
libtool \
libv4l-dev \
libx11-dev \
libxcb-shape0-dev \
libxml2-dev \
make \
meson \
nasm \
ninja-build \
patch \
perl \
pkg-config \
python3 \
python3-pip\
python3-setuptools \
python3-wheel \
x11proto-xext-dev \
xserver-xorg-dev \
xz-utils \
yasm \
zlib1g-dev && \
apt-get autoremove -y && \
apt-get clean -y
# aom
RUN mkdir -p /tmp/aom && \
git clone \
--branch ${AOM} \
--depth 1 https://aomedia.googlesource.com/aom \
/tmp/aom
RUN cd /tmp/aom && \
rm -rf \
CMakeCache.txt \
CMakeFiles && \
mkdir -p \
aom_build && \
cd aom_build && \
cmake \
-DBUILD_STATIC_LIBS=0 .. && \
make && \
make install
# dav1d
RUN mkdir -p /tmp/dav1d && \
git clone \
--branch ${LIBDAV1D} \
--depth 1 https://github.com/videolan/dav1d.git \
/tmp/dav1d
RUN mkdir /tmp/dav1d/build && cd /tmp/dav1d/build && \
meson setup -Denable_tools=false -Denable_tests=false --libdir /usr/local/lib .. && \
ninja && \
ninja install
# fdk-aac
RUN mkdir -p /tmp/fdk-aac && \
curl -Lf \
https://github.com/mstorsjo/fdk-aac/archive/v${FDKAAC}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/fdk-aac
RUN cd /tmp/fdk-aac && \
autoreconf -fiv && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# freetype
RUN mkdir -p /tmp/freetype && \
curl -Lf \
https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/freetype
RUN cd /tmp/freetype && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# fontconfig
RUN mkdir -p /tmp/fontconfig && \
curl -Lf \
https://www.freedesktop.org/software/fontconfig/release/fontconfig-${FONTCONFIG}.tar.xz | \
tar -Jx --strip-components=1 -C /tmp/fontconfig
RUN cd /tmp/fontconfig && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# fribidi
RUN mkdir -p /tmp/fribidi && \
curl -Lf \
https://github.com/fribidi/fribidi/archive/v${FRIBIDI}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/fribidi
RUN cd /tmp/fribidi && \
./autogen.sh && \
./configure \
--disable-static \
--enable-shared && \
make -j 1 && \
make install
# kvazaar
RUN mkdir -p /tmp/kvazaar && \
curl -Lf \
https://github.com/ultravideo/kvazaar/archive/v${KVAZAAR}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/kvazaar
RUN cd /tmp/kvazaar && \
./autogen.sh && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# lame
RUN mkdir -p /tmp/lame && \
curl -Lf \
http://downloads.sourceforge.net/project/lame/lame/3.100/lame-${LAME}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/lame
RUN cd /tmp/lame && \
cp \
/usr/share/automake-1.16/config.guess \
config.guess && \
cp \
/usr/share/automake-1.16/config.sub \
config.sub && \
./configure \
--disable-frontend \
--disable-static \
--enable-nasm \
--enable-shared && \
make && \
make install
# libass
RUN mkdir -p /tmp/libass && \
curl -Lf \
https://github.com/libass/libass/archive/${LIBASS}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/libass
RUN cd /tmp/libass && \
./autogen.sh && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# libsrt
RUN mkdir -p /tmp/libsrt && \
curl -Lf \
https://github.com/Haivision/srt/archive/v${LIBSRT}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/libsrt
RUN cd /tmp/libsrt && \
cmake . && \
make && \
make install
# libwebp
RUN mkdir -p /tmp/libwebp && \
curl -Lf \
https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${LIBWEBP}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/libwebp
RUN cd /tmp/libwebp && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# ogg
RUN mkdir -p /tmp/ogg && \
curl -Lf \
http://downloads.xiph.org/releases/ogg/libogg-${OGG}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/ogg
RUN cd /tmp/ogg && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# opencore-amr
RUN mkdir -p /tmp/opencore-amr && \
curl -Lf \
http://downloads.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-${OPENCOREAMR}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/opencore-amr
RUN cd /tmp/opencore-amr && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# openjpeg
RUN mkdir -p /tmp/openjpeg && \
curl -Lf \
https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/openjpeg
RUN cd /tmp/openjpeg && \
rm -Rf \
thirdparty/libpng/* && \
curl -Lf \
https://download.sourceforge.net/libpng/libpng-1.6.37.tar.gz | \
tar -zx --strip-components=1 -C thirdparty/libpng/ && \
cmake \
-DBUILD_STATIC_LIBS=0 \
-DBUILD_THIRDPARTY:BOOL=ON . && \
make && \
make install
# opus
RUN mkdir -p /tmp/opus && \
curl -Lf \
https://downloads.xiph.org/releases/opus/opus-${OPUS}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/opus
RUN cd /tmp/opus && \
autoreconf -fiv && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# theora
RUN mkdir -p /tmp/theora && \
curl -Lf \
http://downloads.xiph.org/releases/theora/libtheora-${THEORA}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/theora
RUN cd /tmp/theora && \
cp \
/usr/share/automake-1.16/config.guess \
config.guess && \
cp \
/usr/share/automake-1.16/config.sub \
config.sub && \
curl -fL \
'https://gitlab.xiph.org/xiph/theora/-/commit/7288b539c52e99168488dc3a343845c9365617c8.diff' \
> png.patch && \
patch ./examples/png2theora.c < png.patch && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# vid.stab
RUN mkdir -p /tmp/vid.stab && \
curl -Lf \
https://github.com/georgmartius/vid.stab/archive/v${LIBVIDSTAB}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/vid.stab
RUN cd /tmp/vid.stab && \
echo "" > \
CMakeModules/FindSSE.cmake && \
cmake . && \
make && \
make install
# vorbis
RUN mkdir -p /tmp/vorbis && \
curl -Lf \
http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/vorbis
RUN cd /tmp/vorbis && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# vpx
RUN mkdir -p /tmp/vpx && \
curl -Lf \
https://github.com/webmproject/libvpx/archive/v${VPX}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/vpx
RUN cd /tmp/vpx && \
./configure \
--disable-debug \
--disable-docs \
--disable-examples \
--disable-install-bins \
--disable-static \
--disable-unit-tests \
--enable-pic \
--enable-shared \
--enable-vp8 \
--enable-vp9 \
--enable-vp9-highbitdepth && \
make && \
make install
# x264
RUN mkdir -p /tmp/x264 && \
git clone --branch stable --depth 1 https://github.com/mirror/x264 /tmp/x264
RUN cd /tmp/x264 && \
./configure \
--disable-cli \
--disable-static \
--enable-pic \
--enable-shared && \
make && \
make install
# x265
RUN mkdir -p /tmp/x265 && \
curl -Lf \
https://github.com/videolan/x265/archive/refs/tags/${X265}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/x265
RUN cd /tmp/x265/build/linux && \
export CXXFLAGS="-fPIC" && \
./multilib.sh && \
make -C 8bit install
# xvid
RUN mkdir -p /tmp/xvid && \
curl -Lf \
https://downloads.xvid.com/downloads/xvidcore-${XVID}.tar.gz | \
tar -zx --strip-components=1 -C /tmp/xvid
RUN cd /tmp/xvid/build/generic && \
./configure && \
make && \
make install
# zimg
RUN mkdir -p /tmp/zimg && \
git clone \
--branch release-${ZIMG} --depth 1 \
https://github.com/sekrit-twc/zimg.git \
/tmp/zimg
RUN cd /tmp/zimg && \
./autogen.sh && \
./configure \
--disable-static \
--enable-shared && \
make && \
make install
# ffmpeg
RUN if [ -z ${FFMPEG_VERSION+x} ]; then \
FFMPEG=${FFMPEG_HARD}; \
else \
FFMPEG=${FFMPEG_VERSION}; \
fi && \
mkdir -p /tmp/ffmpeg && \
echo "https://ffmpeg.org/releases/ffmpeg-${FFMPEG}.tar.bz2" && \
curl -Lf \
https://ffmpeg.org/releases/ffmpeg-${FFMPEG}.tar.bz2 | \
tar -jx --strip-components=1 -C /tmp/ffmpeg
RUN cd /tmp/ffmpeg && \
./configure \
--disable-debug \
--disable-doc \
--disable-ffplay \
--enable-ffprobe \
--enable-fontconfig \
--enable-gpl \
--enable-libaom \
--enable-libdav1d \
--enable-libass \
--enable-libfdk_aac \
--enable-libfreetype \
--enable-libkvazaar \
--enable-libmp3lame \
--enable-libopencore-amrnb \
--enable-libopencore-amrwb \
--enable-libopenjpeg \
--enable-libopus \
--enable-libsrt \
--enable-libtheora \
--enable-libv4l2 \
--enable-libvidstab \
--enable-libvorbis \
--enable-libvpx \
--enable-libwebp \
--enable-libxml2 \
--enable-libx264 \
--enable-libx265 \
--enable-libxvid \
--enable-libzimg \
--enable-nonfree \
--enable-openssl \
--enable-small \
--enable-stripping \
--enable-version3 \
--extra-libs=-ldl \
--extra-libs=-lpthread && \
make
RUN ldconfig && \
mkdir -p /buildout/usr/local/bin && \
cp \
/tmp/ffmpeg/ffmpeg \
/buildout/usr/local/bin && \
cp \
/tmp/ffmpeg/ffprobe \
/buildout/usr/local/bin && \
mkdir -p /buildout/usr/lib && \
ldd /tmp/ffmpeg/ffmpeg \
| awk '/local/ {print $3}' \
| xargs -i cp -L {} /buildout/usr/lib/
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS runtime-base
ENV MAKEFLAGS="-j4"
RUN apt-get -yqq update && \
DEBIAN_FRONTEND="noninteractive" apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 libharfbuzz-bin libxml2 libxcb-shape0 libv4l-0 \
&& apt autoremove -y \
&& rm -rf /var/lib/apt/lists/*
COPY --from=devel-base /buildout/ /
RUN apt-get update && \
apt-get install -y libicu-dev tzdata fontconfig fonts-noto-core fonts-noto-cjk libgdiplus libdrm2 && \
rm -rf /var/lib/apt/lists/*
CMD ["--help"]
ENTRYPOINT ["ffmpeg"]