super-re-encode / Dockerfile
patocolher's picture
Upload 2 files
a39df2c verified
Raw
History Blame Contribute Delete
4.22 kB
# ── Stage 1: compilação (imagem devel com headers CUDA) ───────
FROM nvidia/cuda:12.4.1-devel-ubuntu22.04 AS builder
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential nasm yasm bzip2 git wget \
libfdk-aac-dev libx264-dev libx265-dev libnuma-dev zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
# nv-codec-headers (necessário para h264_nvenc / hevc_nvenc / cuvid)
RUN git clone --depth 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers.git /tmp/nv-codec-headers \
&& make -C /tmp/nv-codec-headers install \
&& rm -rf /tmp/nv-codec-headers
# Compila ffmpeg 7.1.1 — SEM --disable-everything.
# O --disable-everything desabilita a infraestrutura interna (mpegvideo,
# bwdif, etc.) e o configure silenciosamente ignora componentes que
# dependem dessa infra, mesmo com --enable-decoder/demuxer/filter explícitos.
# Compilando com todos os componentes padrão, garantimos suporte completo
# a VOB, MPG, TS, e qualquer formato, sem surpresas.
RUN wget -q -O /tmp/ffmpeg.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.1.1.tar.bz2 \
&& tar xf /tmp/ffmpeg.tar.bz2 -C /tmp \
&& rm /tmp/ffmpeg.tar.bz2 \
&& cd /tmp/ffmpeg-7.1.1 \
&& ./configure \
--prefix=/usr/local \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-nvenc \
--enable-nvdec \
--enable-cuda \
--enable-cuvid \
--enable-zlib \
--extra-cflags="-O2 -pipe -I/usr/local/cuda/include" \
--extra-ldflags="-s -L/usr/local/cuda/lib64" \
--disable-doc \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
&& make -j"$(nproc)" \
&& make install \
&& rm -rf /tmp/ffmpeg-7.1.1
# ── Stage 2: imagem final (runtime leve) ──────────────────────
FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
# Só as libs de runtime necessárias
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 python3-pip ca-certificates \
libfdk-aac2 libx264-163 libx265-199 libnuma1 zlib1g \
&& rm -rf /var/lib/apt/lists/*
# Copia apenas os binários compilados do stage 1
COPY --from=builder /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg
COPY --from=builder /usr/local/bin/ffprobe /usr/local/bin/ffprobe
# ── Validação rápida dos componentes essenciais ──
# Usa grep -qE com \s+ para ser tolerante ao formato de colunas do FFmpeg,
# que usa espaçamento variável. Falhas são WARNING (não matam o build),
# pois sem --disable-everything todos os componentes padrão vêm habilitados.
RUN ffmpeg -version | head -1; \
echo "--- encoders ---"; \
for c in libx264 libx265 h264_nvenc hevc_nvenc libfdk_aac; do \
ffmpeg -encoders 2>/dev/null | grep -qE "\\s${c}\\s" && echo " ✅ $c" || echo " ⚠️ $c NÃO encontrado"; \
done; \
echo "--- decoders ---"; \
for c in h264 hevc vp9 aac mp3 mpeg2video mpeg2_cuvid h264_cuvid hevc_cuvid; do \
ffmpeg -decoders 2>/dev/null | grep -qE "\\s${c}\\s" && echo " ✅ $c" || echo " ⚠️ $c NÃO encontrado"; \
done; \
echo "--- hwaccels ---"; \
ffmpeg -hwaccels 2>/dev/null | grep -qE "cuda" && echo " ✅ cuda hwaccel" || echo " ⚠️ cuda hwaccel NÃO encontrado"; \
ffmpeg -hwaccels 2>/dev/null | grep -qE "mpeg2_nvdec" && echo " ✅ mpeg2_nvdec" || echo " ⚠️ mpeg2_nvdec NÃO encontrado"; \
echo "--- filtros VOB ---"; \
for f in bwdif scale fps mpdecimate loudnorm overlay; do \
ffmpeg -filters 2>/dev/null | grep -qE "\\s${f}\\s" && echo " ✅ $f" || echo " ⚠️ $f NÃO encontrado"; \
done; \
echo "--- demuxers VOB ---"; \
ffmpeg -demuxers 2>/dev/null | grep -qE "\\smpeg\\s" && echo " ✅ mpeg demuxer (VOB)" || echo " ⚠️ mpeg demuxer NÃO encontrado"; \
echo "✅ Validação concluída"
WORKDIR /app
COPY app.py .
RUN pip3 install --no-cache-dir urllib3>=2.0.0 gradio>=5.0.0
EXPOSE 7860
ENV PYTHONUNBUFFERED=1
CMD ["python3", "app.py"]