Add HLS bitrate patch

This commit is contained in:
Ingo Oppermann
2022-07-13 16:24:26 +02:00
parent 31d8aeb6e2
commit ff979fcf51
6 changed files with 370 additions and 267 deletions

View File

@@ -55,7 +55,7 @@ RUN apk add -U \
lame-dev=${LAME_VERSION} \
opus-dev=${OPUS_VERSION} \
libvorbis-dev=${VORBIS_VERSION} \
v4l-utils-dev=${V4L_VERSION}
v4l-utils-dev=${V4L_VERSION}
# install and patch ffmpeg
RUN mkdir -p /dist && cd /dist && \
@@ -67,6 +67,7 @@ COPY ./contrib /contrib
RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
patch -p1 < /contrib/ffmpeg-jsonstats.patch && \
patch -p1 < /contrib/ffmpeg-hlsbitrate.patch && \
./configure \
--extra-version=datarhei \
--prefix="${SRC}" \
@@ -127,11 +128,11 @@ ARG FBDEV_VERSION=0.5.0-r3
ARG V4L_VERSION=1.22.1-r1
RUN apk add --no-cache \
ca-certificates \
tzdata \
xf86-video-fbdev=${FBDEV_VERSION} \
v4l-utils=${V4L_VERSION} && \
ffmpeg -buildconf
ca-certificates \
tzdata \
xf86-video-fbdev=${FBDEV_VERSION} \
v4l-utils=${V4L_VERSION} && \
ffmpeg -buildconf
WORKDIR /tmp
ENTRYPOINT ["/usr/bin/ffmpeg"]

View File

@@ -61,7 +61,7 @@ RUN apk add \
opus-dev=${OPUS_VERSION} \
libvorbis-dev=${VORBIS_VERSION} \
alsa-lib-dev=${ALSA_VERSION} \
v4l-utils-dev=${V4L_VERSION}
v4l-utils-dev=${V4L_VERSION}
# install and patch ffmpeg
RUN mkdir -p /dist && cd /dist && \
@@ -76,6 +76,7 @@ RUN echo $uname
RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
apkArch="$(apk --print-arch)" && if [ $apkArch != "aarch64" ]; then MMAL_SUPPORT="--enable-mmal"; fi && \
patch -p1 < /contrib/ffmpeg-jsonstats.patch && \
patch -p1 < /contrib/ffmpeg-hlsbitrate.patch && \
./configure \
--extra-version=datarhei \
--prefix="${SRC}" \
@@ -89,7 +90,7 @@ RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
--enable-libxml2 \
--enable-omx \
--enable-omx-rpi \
$MMAL_SUPPORT \
$MMAL_SUPPORT \
--enable-libv4l2 \
--enable-v4l2_m2m \
--enable-alsa \
@@ -112,25 +113,25 @@ RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
RUN mkdir -p /ffmpeg/lib && \
cp \
/usr/lib/libfreetype.so.6 \
/usr/lib/libbrotlidec.so.1 \
/usr/lib/libbrotlicommon.so.1 \
/usr/lib/libbz2.so.1 \
/usr/lib/libpng16.so.16 \
/usr/lib/libxml2.so.2 \
/usr/lib/liblzma.so.5 \
/usr/lib/libsrt.so.1 \
/usr/lib/libx264.so.163 \
/usr/lib/libx265.so.199 \
/usr/lib/libvpx.so.6 \
/usr/lib/libmp3lame.so.0 \
/usr/lib/libopus.so.0 \
/usr/lib/libvorbis.so.0 \
/usr/lib/libogg.so.0 \
/usr/lib/libvorbisenc.so.2 \
/usr/lib/libgcc_s.so.1 \
/usr/lib/libstdc++.so.6 \
/ffmpeg/lib
/usr/lib/libfreetype.so.6 \
/usr/lib/libbrotlidec.so.1 \
/usr/lib/libbrotlicommon.so.1 \
/usr/lib/libbz2.so.1 \
/usr/lib/libpng16.so.16 \
/usr/lib/libxml2.so.2 \
/usr/lib/liblzma.so.5 \
/usr/lib/libsrt.so.1 \
/usr/lib/libx264.so.163 \
/usr/lib/libx265.so.199 \
/usr/lib/libvpx.so.6 \
/usr/lib/libmp3lame.so.0 \
/usr/lib/libopus.so.0 \
/usr/lib/libvorbis.so.0 \
/usr/lib/libogg.so.0 \
/usr/lib/libvorbisenc.so.2 \
/usr/lib/libgcc_s.so.1 \
/usr/lib/libstdc++.so.6 \
/ffmpeg/lib
FROM $ALPINE_IMAGE as final
@@ -142,14 +143,14 @@ ARG V4L_VERSION=1.22.1-r1
ARG RPI_VERSION=0.20200813-r0
RUN apk add --no-cache \
ca-certificates \
tzdata \
alsa-lib \
xf86-video-fbdev=${FBDEV_VERSION} \
v4l-utils=${V4L_VERSION} \
raspberrypi-libs=${RPI_VERSION} && \
echo "/opt/vc/lib:/usr/local/lib:/usr/lib:/lib" > /etc/ld-musl-armhf.path && \
ffmpeg -buildconf
ca-certificates \
tzdata \
alsa-lib \
xf86-video-fbdev=${FBDEV_VERSION} \
v4l-utils=${V4L_VERSION} \
raspberrypi-libs=${RPI_VERSION} && \
echo "/opt/vc/lib:/usr/local/lib:/usr/lib:/lib" > /etc/ld-musl-armhf.path && \
ffmpeg -buildconf
WORKDIR /tmp
ENTRYPOINT ["/usr/bin/ffmpeg"]

View File

@@ -53,9 +53,9 @@ RUN apk add --update \
tar \
zlib-dev
# install shared ffmpeg libs
# install shared ffmpeg libs
RUN apk add -U \
freetype-dev=${FREETYPE_VERSION} \
freetype-dev=${FREETYPE_VERSION} \
libsrt-dev=${SRT_VERSION} \
x264-dev=${X264_VERSION} \
x265-dev=${X265_VERSION} \
@@ -63,28 +63,28 @@ RUN apk add -U \
lame-dev=${LAME_VERSION} \
opus-dev=${OPUS_VERSION} \
libvorbis-dev=${VORBIS_VERSION} \
v4l-utils-dev=${V4L_VERSION}
# install shared ffmpeg libs
v4l-utils-dev=${V4L_VERSION}
# install shared ffmpeg libs
RUN echo http://dl-2.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories
RUN apk add -U \
libva-dev=${LIBAV_VERSION} \
libvdpau-dev=${LIBVDPAU_VERSION} \
libva-intel-driver=${INTEL_VAAPI_DRIVER} \
mesa-va-gallium=${MESA_VA_GALLIUM_VERSION} \
mesa-vdpau-gallium=${MESA_VDPAU_GALLIUM_VERSION}
libvdpau-dev=${LIBVDPAU_VERSION} \
libva-intel-driver=${INTEL_VAAPI_DRIVER} \
mesa-va-gallium=${MESA_VA_GALLIUM_VERSION} \
mesa-vdpau-gallium=${MESA_VDPAU_GALLIUM_VERSION}
# install shared ffmpeg libs
# install shared ffmpeg libs
RUN echo http://dl-2.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories
RUN apk add -U \
intel-gmmlib-dev=${INTEL_GMMLIB_VERSION} \
intel-media-driver-dev=${INTEL_MEDIA_DRIVER_VERSION} \
intel-media-sdk-dev=${INTEL_MEDIA_SDK_VERSION}
intel-gmmlib-dev=${INTEL_GMMLIB_VERSION} \
intel-media-driver-dev=${INTEL_MEDIA_DRIVER_VERSION} \
intel-media-sdk-dev=${INTEL_MEDIA_SDK_VERSION}
# install shared ffmpeg libs
# install shared ffmpeg libs
RUN echo http://dl-2.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories
RUN apk add -U \
libva-vdpau-driver=${LIBVA_VDPAU_DRIVER_VERSION}
libva-vdpau-driver=${LIBVA_VDPAU_DRIVER_VERSION}
# install and patch ffmpeg
RUN mkdir -p /dist && cd /dist && \
@@ -96,6 +96,7 @@ COPY ./contrib /contrib
RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
patch -p1 < /contrib/ffmpeg-jsonstats.patch && \
patch -p1 < /contrib/ffmpeg-hlsbitrate.patch && \
./configure \
--extra-version=datarhei \
--prefix="${SRC}" \
@@ -115,7 +116,7 @@ RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libmfx \
--enable-libmfx \
--enable-vaapi \
--enable-vdpau \
--disable-ffplay \
@@ -129,39 +130,39 @@ RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
RUN mkdir -p /ffmpeg/lib && \
cp \
/usr/lib/libfreetype.so.6 \
/usr/lib/libbrotlidec.so.1 \
/usr/lib/libbrotlicommon.so.1 \
/usr/lib/libbz2.so.1 \
/usr/lib/libpng16.so.16 \
/usr/lib/libsrt.so.1 \
/usr/lib/libx264.so.163 \
/usr/lib/libx265.so.199 \
/usr/lib/libvpx.so.6 \
/usr/lib/libmp3lame.so.0 \
/usr/lib/libopus.so.0 \
/usr/lib/libvorbis.so.0 \
/usr/lib/libogg.so.0 \
/usr/lib/libvorbisenc.so.2 \
/usr/lib/libgcc_s.so.1 \
/usr/lib/libstdc++.so.6 \
/usr/lib/libxcb.so.1 \
/usr/lib/libXau.so.6 \
/usr/lib/libXdmcp.so.6 \
/usr/lib/libbsd.so.0 \
/usr/lib/libmd.so.0 \
/usr/lib/libxcb-shm.so.0 \
/usr/lib/libxcb-shape.so.0 \
/usr/lib/libxcb-xfixes.so.0 \
/usr/lib/libva.so.2 \
/usr/lib/libmfx.so.1 \
/usr/lib/libva-drm.so.2 \
/usr/lib/libdrm.so.2 \
/usr/lib/libvdpau.so.1 \
/usr/lib/libXext.so.6 \
/usr/lib/libX11.so.6 \
/usr/lib/libva-x11.so.2 \
/ffmpeg/lib
/usr/lib/libfreetype.so.6 \
/usr/lib/libbrotlidec.so.1 \
/usr/lib/libbrotlicommon.so.1 \
/usr/lib/libbz2.so.1 \
/usr/lib/libpng16.so.16 \
/usr/lib/libsrt.so.1 \
/usr/lib/libx264.so.163 \
/usr/lib/libx265.so.199 \
/usr/lib/libvpx.so.6 \
/usr/lib/libmp3lame.so.0 \
/usr/lib/libopus.so.0 \
/usr/lib/libvorbis.so.0 \
/usr/lib/libogg.so.0 \
/usr/lib/libvorbisenc.so.2 \
/usr/lib/libgcc_s.so.1 \
/usr/lib/libstdc++.so.6 \
/usr/lib/libxcb.so.1 \
/usr/lib/libXau.so.6 \
/usr/lib/libXdmcp.so.6 \
/usr/lib/libbsd.so.0 \
/usr/lib/libmd.so.0 \
/usr/lib/libxcb-shm.so.0 \
/usr/lib/libxcb-shape.so.0 \
/usr/lib/libxcb-xfixes.so.0 \
/usr/lib/libva.so.2 \
/usr/lib/libmfx.so.1 \
/usr/lib/libva-drm.so.2 \
/usr/lib/libdrm.so.2 \
/usr/lib/libvdpau.so.1 \
/usr/lib/libXext.so.6 \
/usr/lib/libX11.so.6 \
/usr/lib/libva-x11.so.2 \
/ffmpeg/lib
FROM $ALPINE_IMAGE as final
@@ -179,22 +180,22 @@ ARG V4L_VERSION=1.22.1-r1
# install shared ffmpeg libs
RUN apk add --no-cache -U \
ca-certificates \
tzdata \
xf86-video-fbdev=${FBDEV_VERSION} \
v4l-utils=${V4L_VERSION} && \
echo http://dl-2.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories && \
apk add --no-cache -U \
libva-intel-driver=${INTEL_VAAPI_DRIVER} \
mesa-va-gallium=${MESA_VA_GALLIUM_VERSION} \
mesa-vdpau-gallium=${MESA_VDPAU_GALLIUM_VERSION} && \
echo http://dl-2.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories && \
apk add --no-cache -U \
intel-media-driver=${INTEL_MEDIA_DRIVER_VERSION} && \
echo http://dl-2.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories && \
apk add --no-cache -U \
libva-vdpau-driver=${LIBVA_VDPAU_DRIVER_VERSION} && \
ffmpeg -buildconf
ca-certificates \
tzdata \
xf86-video-fbdev=${FBDEV_VERSION} \
v4l-utils=${V4L_VERSION} && \
echo http://dl-2.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories && \
apk add --no-cache -U \
libva-intel-driver=${INTEL_VAAPI_DRIVER} \
mesa-va-gallium=${MESA_VA_GALLIUM_VERSION} \
mesa-vdpau-gallium=${MESA_VDPAU_GALLIUM_VERSION} && \
echo http://dl-2.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories && \
apk add --no-cache -U \
intel-media-driver=${INTEL_MEDIA_DRIVER_VERSION} && \
echo http://dl-2.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories && \
apk add --no-cache -U \
libva-vdpau-driver=${LIBVA_VDPAU_DRIVER_VERSION} && \
ffmpeg -buildconf
WORKDIR /tmp
ENTRYPOINT ["/usr/bin/ffmpeg"]

View File

@@ -22,198 +22,199 @@ ENV SRC=/usr/local
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y && \
apt-get install -y \
pkg-config \
curl \
git \
nasm \
openssl \
libssl-dev \
cmake \
yasm \
build-essential \
libtool \
autoconf \
libv4l-dev
apt-get install -y \
pkg-config \
curl \
git \
nasm \
openssl \
libssl-dev \
cmake \
yasm \
build-essential \
libtool \
autoconf \
libv4l-dev
# install x264
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://code.videolan.org/videolan/x264/-/archive/stable/x264-${X264_VERSION}.tar.gz && \
tar xfvz x264-${X264_VERSION}.tar.gz && \
rm x264-${X264_VERSION}.tar.gz && \
cd x264-${X264_VERSION}* && \
./configure \
--SRC="${SRC}" \
--bindir="${SRC}/bin" \
--enable-shared && \
make -j$(nproc) && \
make install
curl -OLk https://code.videolan.org/videolan/x264/-/archive/stable/x264-${X264_VERSION}.tar.gz && \
tar xfvz x264-${X264_VERSION}.tar.gz && \
rm x264-${X264_VERSION}.tar.gz && \
cd x264-${X264_VERSION}* && \
./configure \
--SRC="${SRC}" \
--bindir="${SRC}/bin" \
--enable-shared && \
make -j$(nproc) && \
make install
# install x265
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://github.com/videolan/x265/archive/refs/tags/${X265_VERSION}.tar.gz && \
tar xfvz ${X265_VERSION}.tar.gz && \
rm ${X265_VERSION}.tar.gz && \
cd x265-${X265_VERSION}/build/linux \
sed -i "/-DEXTRA_LIB/ s/$/ -DCMAKE_INSTALL_SRC=\${SRC}/" multilib.sh && \
sed -i "/^cmake/ s/$/ -DENABLE_CLI=OFF/" multilib.sh && \
./multilib.sh && \
make -C 8bit install && \
rm -rf ${DIR}
curl -OLk https://github.com/videolan/x265/archive/refs/tags/${X265_VERSION}.tar.gz && \
tar xfvz ${X265_VERSION}.tar.gz && \
rm ${X265_VERSION}.tar.gz && \
cd x265-${X265_VERSION}/build/linux \
sed -i "/-DEXTRA_LIB/ s/$/ -DCMAKE_INSTALL_SRC=\${SRC}/" multilib.sh && \
sed -i "/^cmake/ s/$/ -DENABLE_CLI=OFF/" multilib.sh && \
./multilib.sh && \
make -C 8bit install && \
rm -rf ${DIR}
# install opus
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz && \
tar xfvz opus-${OPUS_VERSION}.tar.gz && \
rm opus-${OPUS_VERSION}.tar.gz && \
cd opus-${OPUS_VERSION} && \
autoreconf -fiv && \
./configure --prefix="${SRC}" \
--enable-shared && \
make && \
make install
curl -OLk https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz && \
tar xfvz opus-${OPUS_VERSION}.tar.gz && \
rm opus-${OPUS_VERSION}.tar.gz && \
cd opus-${OPUS_VERSION} && \
autoreconf -fiv && \
./configure --prefix="${SRC}" \
--enable-shared && \
make && \
make install
# install ogg
RUN mkdir -p /dist && cd /dist && \
curl -OLk http://downloads.xiph.org/releases/ogg/libogg-${OGG_VERSION}.tar.gz && \
tar xfvz libogg-${OGG_VERSION}.tar.gz && \
rm libogg-${OGG_VERSION}.tar.gz && \
cd libogg-${OGG_VERSION} && \
./configure --prefix="${SRC}" \
--enable-shared && \
make && \
make install
curl -OLk http://downloads.xiph.org/releases/ogg/libogg-${OGG_VERSION}.tar.gz && \
tar xfvz libogg-${OGG_VERSION}.tar.gz && \
rm libogg-${OGG_VERSION}.tar.gz && \
cd libogg-${OGG_VERSION} && \
./configure --prefix="${SRC}" \
--enable-shared && \
make && \
make install
# install vorbis
RUN mkdir -p /dist && cd /dist && \
curl -OLk http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VERSION}.tar.gz && \
tar xfvz libvorbis-${VORBIS_VERSION}.tar.gz && \
rm libvorbis-${VORBIS_VERSION}.tar.gz && \
cd libvorbis-${VORBIS_VERSION} && \
./configure --prefix="${SRC}" --with-ogg="${SRC}" \
--enable-shared && \
make && \
make install
curl -OLk http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VERSION}.tar.gz && \
tar xfvz libvorbis-${VORBIS_VERSION}.tar.gz && \
rm libvorbis-${VORBIS_VERSION}.tar.gz && \
cd libvorbis-${VORBIS_VERSION} && \
./configure --prefix="${SRC}" --with-ogg="${SRC}" \
--enable-shared && \
make && \
make install
# install libmp3lame
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://downloads.sourceforge.net/project/lame/lame/${LAME_VERSION}/lame-${LAME_VERSION}.tar.gz && \
tar -xvz -f lame-${LAME_VERSION}.tar.gz && \
rm lame-${LAME_VERSION}.tar.gz && \
cd lame-${LAME_VERSION} && \
./configure \
--prefix="${SRC}" \
--bindir="${SRC}/bin" \
--disable-static \
--enable-nasm && \
make -j$(nproc) && \
make install
curl -OLk https://downloads.sourceforge.net/project/lame/lame/${LAME_VERSION}/lame-${LAME_VERSION}.tar.gz && \
tar -xvz -f lame-${LAME_VERSION}.tar.gz && \
rm lame-${LAME_VERSION}.tar.gz && \
cd lame-${LAME_VERSION} && \
./configure \
--prefix="${SRC}" \
--bindir="${SRC}/bin" \
--disable-static \
--enable-nasm && \
make -j$(nproc) && \
make install
# install vpx
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://github.com/webmproject/libvpx/archive/refs/tags/v${VPX_VERSION}.tar.gz && \
tar xfvz v${VPX_VERSION}.tar.gz && \
rm v${VPX_VERSION}.tar.gz && \
cd libvpx-${VPX_VERSION} && \
./configure --prefix="${SRC}" \
--enable-vp8 \
--enable-vp9 \
--enable-vp9-highbitdepth \
--enable-pic \
--enable-shared \
--disable-debug \
--disable-examples \
--disable-docs \
--disable-install-bins && \
make && \
make install
curl -OLk https://github.com/webmproject/libvpx/archive/refs/tags/v${VPX_VERSION}.tar.gz && \
tar xfvz v${VPX_VERSION}.tar.gz && \
rm v${VPX_VERSION}.tar.gz && \
cd libvpx-${VPX_VERSION} && \
./configure --prefix="${SRC}" \
--enable-vp8 \
--enable-vp9 \
--enable-vp9-highbitdepth \
--enable-pic \
--enable-shared \
--disable-debug \
--disable-examples \
--disable-docs \
--disable-install-bins && \
make && \
make install
# install freetype
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \
tar xfvz freetype-${FREETYPE_VERSION}.tar.gz && \
rm freetype-${FREETYPE_VERSION}.tar.gz && \
cd freetype-${FREETYPE_VERSION} && \
./configure --prefix="${SRC}" \
--disable-static \
--enable-shared && \
make && \
make install
curl -OLk https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \
tar xfvz freetype-${FREETYPE_VERSION}.tar.gz && \
rm freetype-${FREETYPE_VERSION}.tar.gz && \
cd freetype-${FREETYPE_VERSION} && \
./configure --prefix="${SRC}" \
--disable-static \
--enable-shared && \
make && \
make install
# install srt
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://github.com/Haivision/srt/archive/refs/tags/v${SRT_VERSION}.tar.gz && \
tar xfvz v${SRT_VERSION}.tar.gz && \
rm v${SRT_VERSION}.tar.gz && \
cd srt-${SRT_VERSION} && \
cmake \
-G "Unix Makefiles" \
-DCMAKE_INSTALL_BINDIR="$SRC/bin" \
-DCMAKE_INSTALL_INCLUDEDIR="$SRC/include" \
-DCMAKE_INSTALL_LIBDIR="$SRC/lib" \
-DCMAKE_INSTALL_SRC="$SRC" && \
make && \
make install
curl -OLk https://github.com/Haivision/srt/archive/refs/tags/v${SRT_VERSION}.tar.gz && \
tar xfvz v${SRT_VERSION}.tar.gz && \
rm v${SRT_VERSION}.tar.gz && \
cd srt-${SRT_VERSION} && \
cmake \
-G "Unix Makefiles" \
-DCMAKE_INSTALL_BINDIR="$SRC/bin" \
-DCMAKE_INSTALL_INCLUDEDIR="$SRC/include" \
-DCMAKE_INSTALL_LIBDIR="$SRC/lib" \
-DCMAKE_INSTALL_SRC="$SRC" && \
make && \
make install
# install libxml2
RUN mkdir -p /dist && cd /dist && \
curl -OLk https://github.com/GNOME/libxml2/archive/refs/tags/v${XML2_VERSION}.tar.gz && \
tar xfvz v${XML2_VERSION}.tar.gz && \
rm v${XML2_VERSION}.tar.gz && \
cd libxml2-${XML2_VERSION} && \
./autogen.sh --prefix="${SRC}" \
--with-ftp=no \
--with-http=no \
--with-python=no && \
make && \
make install
curl -OLk https://github.com/GNOME/libxml2/archive/refs/tags/v${XML2_VERSION}.tar.gz && \
tar xfvz v${XML2_VERSION}.tar.gz && \
rm v${XML2_VERSION}.tar.gz && \
cd libxml2-${XML2_VERSION} && \
./autogen.sh --prefix="${SRC}" \
--with-ftp=no \
--with-http=no \
--with-python=no && \
make && \
make install
# install and patch ffmpeg
RUN mkdir -p /dist && cd /dist && \
curl -OLk http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \
curl -OLk https://github.com/FFmpeg/nv-codec-headers/releases/download/n${FFNVCODEC_VERSION}/nv-codec-headers-${FFNVCODEC_VERSION}.tar.gz && \
tar -xvz -f ffmpeg-${FFMPEG_VERSION}.tar.gz && \
tar -xvz -f nv-codec-headers-${FFNVCODEC_VERSION}.tar.gz && \
rm ffmpeg-${FFMPEG_VERSION}.tar.gz nv-codec-headers-${FFNVCODEC_VERSION}.tar.gz && \
cd nv-codec-headers-${FFNVCODEC_VERSION} && \
make install
curl -OLk http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \
curl -OLk https://github.com/FFmpeg/nv-codec-headers/releases/download/n${FFNVCODEC_VERSION}/nv-codec-headers-${FFNVCODEC_VERSION}.tar.gz && \
tar -xvz -f ffmpeg-${FFMPEG_VERSION}.tar.gz && \
tar -xvz -f nv-codec-headers-${FFNVCODEC_VERSION}.tar.gz && \
rm ffmpeg-${FFMPEG_VERSION}.tar.gz nv-codec-headers-${FFNVCODEC_VERSION}.tar.gz && \
cd nv-codec-headers-${FFNVCODEC_VERSION} && \
make install
COPY ./contrib /contrib
RUN cd /dist/ffmpeg-${FFMPEG_VERSION} && \
patch -p1 < /contrib/ffmpeg-jsonstats.patch && \
./configure \
--extra-version=datahrei \
--prefix="${SRC}" \
--extra-cflags=-I/usr/local/cuda/include \
--extra-ldflags=-L/usr/local/cuda/lib64 \
--enable-nonfree \
--enable-gpl \
--enable-version3 \
--enable-postproc \
--enable-static \
--enable-openssl \
--enable-libxml2 \
--enable-cuda \
--enable-cuvid \
--enable-nvenc \
--enable-libnpp \
--enable-libv4l2 \
--enable-libfreetype \
--enable-libsrt \
--enable-libx264 \
--enable-libx265 \
--enable-libvpx \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--disable-ffplay \
--disable-ffprobe \
--disable-debug \
--disable-doc && \
make -j$(nproc) && \
make install && \
hash -r
patch -p1 < /contrib/ffmpeg-jsonstats.patch && \
patch -p1 < /contrib/ffmpeg-hlsbitrate.patch && \
./configure \
--extra-version=datahrei \
--prefix="${SRC}" \
--extra-cflags=-I/usr/local/cuda/include \
--extra-ldflags=-L/usr/local/cuda/lib64 \
--enable-nonfree \
--enable-gpl \
--enable-version3 \
--enable-postproc \
--enable-static \
--enable-openssl \
--enable-libxml2 \
--enable-cuda \
--enable-cuvid \
--enable-nvenc \
--enable-libnpp \
--enable-libv4l2 \
--enable-libfreetype \
--enable-libsrt \
--enable-libx264 \
--enable-libx265 \
--enable-libvpx \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--disable-ffplay \
--disable-ffprobe \
--disable-debug \
--disable-doc && \
make -j$(nproc) && \
make install && \
hash -r
FROM $DEPLOY_IMAGE
@@ -221,12 +222,12 @@ COPY --from=builder /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg
COPY --from=builder /usr/local/lib /usr/local/lib
RUN echo "/usr/local/lib" > /etc/ld.so.conf.d/ffmpeg.conf && \
ldconfig && \
ldconfig && \
apt-get update && \
apt-get install -y \
v4l-utils \
fbset && \
ffmpeg -buildconf
v4l-utils \
fbset && \
ffmpeg -buildconf
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,video,utility

View File

@@ -1,9 +1,11 @@
# FFmpeg Base
FFmpeg base image for [datarhei/core](https://github.com/datarhei/core).
Branch: 5.0
## Config:
```sh
--enable-libv4l2
--enable-libfreetype
@@ -15,22 +17,27 @@ Branch: 5.0
--enable-libopus
--enable-libvorbis
```
*Additional informations can be found in the Dockerfiles.*
_Additional informations can be found in the Dockerfiles._
## Patches:
- JSON-Stats (expands progress data per file in json format)
- HLS Bitrate (calculates bitrate estimate for HLS master playlist)
## Images and Plattforms:
Dockerimage | OS | Plattform | GPU
-----------|----|-----------|----
docker.io/datarhei/base:alpine-ffmpeg-latest | Alpine 3.15 | linux/amd64, linux/arm64, linux/arm/v7 | -
docker.io/datarhei/base:alpine-ffmpeg-rpi-latest | Alpine 3.15 | Raspberry Pi (linux/arm/v7, linux/arm64) | MMAL/OMX/V4L2-M2M (32bit), V4L2-M2M (64bit)
docker.io/datarhei/base:alpine-ffmpeg-vaapi-latest | Alpine 3.15 | linux/amd64 | Intel VAAPI
docker.io/datarhei/base:ubuntu-ffmpeg-cuda-latest | Ubuntu 20.03 | linux/amd64 | Nvidia Cuda
| Dockerimage | OS | Plattform | GPU |
| -------------------------------------------------- | ------------ | ---------------------------------------- | ------------------------------------------- |
| docker.io/datarhei/base:alpine-ffmpeg-latest | Alpine 3.15 | linux/amd64, linux/arm64, linux/arm/v7 | - |
| docker.io/datarhei/base:alpine-ffmpeg-rpi-latest | Alpine 3.15 | Raspberry Pi (linux/arm/v7, linux/arm64) | MMAL/OMX/V4L2-M2M (32bit), V4L2-M2M (64bit) |
| docker.io/datarhei/base:alpine-ffmpeg-vaapi-latest | Alpine 3.15 | linux/amd64 | Intel VAAPI |
| docker.io/datarhei/base:ubuntu-ffmpeg-cuda-latest | Ubuntu 20.03 | linux/amd64 | Nvidia Cuda |
More tags: https://hub.docker.com/repository/docker/datarhei/base/general
## Testing
```sh
$ docker buildx create builder
$ docker buildx use builder
@@ -40,10 +47,13 @@ $ docker buildx rm builder
```
## Known problems:
The libraries are currently not compiled due to errors caused by Docker virtualisation.
The libraries are currently not compiled due to errors caused by Docker virtualisation.
## Feature requests:
Please create an issue with your use case and all the requirements.
## Licence
LGPL-licensed with optional components licensed under GPL. Please refer to the LICENSE file for detailed information.

View File

@@ -0,0 +1,89 @@
From 85870fdb0530c8d12faa682bd571060b0fa8fb73 Mon Sep 17 00:00:00 2001
From: Ingo Oppermann <ingo@datarhei.com>
Date: Wed, 13 Jul 2022 14:26:24 +0200
Subject: [PATCH v1] Calculate bandwidth estimate (ffmpeg 5.0)
---
libavformat/hlsenc.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index ef8973c..8e437de 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -125,6 +125,7 @@ typedef struct VariantStream {
AVIOContext *out;
AVIOContext *out_single_file;
int packets_written;
+ uint64_t bytes_written;
int init_range_length;
uint8_t *temp_buffer;
uint8_t *init_buffer;
@@ -139,6 +140,8 @@ typedef struct VariantStream {
double dpp; // duration per packet
int64_t start_pts;
int64_t end_pts;
+ int64_t scaled_start_pts;
+ int64_t scaled_cur_pts;
int64_t video_lastpos;
int64_t video_keyframe_pos;
int64_t video_keyframe_size;
@@ -1482,6 +1485,16 @@ static int create_master_playlist(AVFormatContext *s,
bandwidth += get_stream_bit_rate(vid_st);
if (aud_st)
bandwidth += get_stream_bit_rate(aud_st);
+
+ if (bandwidth == 0) {
+ // Estimate bandwidth
+ bandwidth = (int)round((double)vs->bytes_written / (av_q2d(AV_TIME_BASE_Q) * (vs->scaled_cur_pts - vs->scaled_start_pts)) * 8);
+
+ // Reset counters
+ vs->bytes_written = 0;
+ vs->scaled_start_pts = vs->scaled_cur_pts;
+ }
+
bandwidth += bandwidth / 10;
ccgroup = NULL;
@@ -2439,6 +2452,19 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
return AVERROR(ENOMEM);
}
+ if (vs->scaled_start_pts == AV_NOPTS_VALUE) {
+ vs->scaled_start_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
+ }
+
+ if (vs->scaled_cur_pts == AV_NOPTS_VALUE) {
+ vs->scaled_cur_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
+ } else {
+ int64_t pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
+ if (pts > vs->scaled_cur_pts) {
+ vs->scaled_cur_pts = pts;
+ }
+ }
+
end_pts = hls->recording_time * vs->number;
if (vs->sequence - vs->nb_entries > hls->start_sequence && hls->init_time > 0) {
@@ -2656,6 +2682,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
}
vs->packets_written++;
+ vs->bytes_written += (uint64_t)pkt->size;
if (oc->pb) {
ret = ff_write_chained(oc, stream_index, pkt, s, 0);
vs->video_keyframe_size += pkt->size;
@@ -2949,6 +2976,8 @@ static int hls_init(AVFormatContext *s)
vs->sequence = hls->start_sequence;
vs->start_pts = AV_NOPTS_VALUE;
vs->end_pts = AV_NOPTS_VALUE;
+ vs->scaled_start_pts = AV_NOPTS_VALUE;
+ vs->scaled_cur_pts = AV_NOPTS_VALUE;
vs->current_segment_final_filename_fmt[0] = '\0';
vs->initial_prog_date_time = initial_program_date_time;
base-commit: 82c775a733a6b3a1a951b7cb1d4fd965bfd2b4dc
--
2.32.1 (Apple Git-133)