From ff979fcf51ef07616dd65ad46ec33808f249a712 Mon Sep 17 00:00:00 2001 From: Ingo Oppermann Date: Wed, 13 Jul 2022 16:24:26 +0200 Subject: [PATCH] Add HLS bitrate patch --- Dockerfile.alpine | 13 +- Dockerfile.alpine.rpi | 59 +++--- Dockerfile.alpine.vaapi | 131 ++++++------- Dockerfile.ubuntu.cuda | 319 ++++++++++++++++---------------- README.md | 26 ++- contrib/ffmpeg-hlsbitrate.patch | 89 +++++++++ 6 files changed, 370 insertions(+), 267 deletions(-) create mode 100644 contrib/ffmpeg-hlsbitrate.patch diff --git a/Dockerfile.alpine b/Dockerfile.alpine index b73bf1a..5531386 100644 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -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"] diff --git a/Dockerfile.alpine.rpi b/Dockerfile.alpine.rpi index f7186ab..b136134 100644 --- a/Dockerfile.alpine.rpi +++ b/Dockerfile.alpine.rpi @@ -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"] diff --git a/Dockerfile.alpine.vaapi b/Dockerfile.alpine.vaapi index 4fdd739..76fb043 100644 --- a/Dockerfile.alpine.vaapi +++ b/Dockerfile.alpine.vaapi @@ -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"] diff --git a/Dockerfile.ubuntu.cuda b/Dockerfile.ubuntu.cuda index 31ce06f..7a2e79a 100644 --- a/Dockerfile.ubuntu.cuda +++ b/Dockerfile.ubuntu.cuda @@ -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 diff --git a/README.md b/README.md index 0c1ec24..16ac2a2 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/contrib/ffmpeg-hlsbitrate.patch b/contrib/ffmpeg-hlsbitrate.patch new file mode 100644 index 0000000..8ccfe72 --- /dev/null +++ b/contrib/ffmpeg-hlsbitrate.patch @@ -0,0 +1,89 @@ +From 85870fdb0530c8d12faa682bd571060b0fa8fb73 Mon Sep 17 00:00:00 2001 +From: Ingo Oppermann +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) +