# ── 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"]