# ── 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 com libfdk_aac + NVENC 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 \ --disable-everything \ --enable-encoder=libx264,libx265,libfdk_aac,aac,h264_nvenc,hevc_nvenc \ --enable-decoder=h264,hevc,vp9,vp9_cuvid,aac,mp3,ac3,eac3,opus,vorbis,flac,pcm_s16le,pcm_s16be,png,mjpeg \ --enable-hwaccel=h264_nvdec,hevc_nvdec,vp9_nvdec \ --enable-demuxer=mov,mp4,matroska,avi,flv,mpegts,wav,mp3,aac,flac,image2 \ --enable-muxer=mp4,matroska,null \ --enable-filter=loudnorm,volume,aresample,scale,pad,mpdecimate,fps,overlay,crop,format,null \ --enable-protocol=file,pipe \ --enable-libx264 \ --enable-libx265 \ --enable-libfdk-aac \ --enable-nvenc \ --enable-nvdec \ --enable-cuda \ --enable-zlib \ --enable-cuvid \ --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 que todos os filtros, decoders e demuxers necessários estão presentes ── RUN set -e; \ echo "--- versão ---"; ffmpeg -version | head -1; \ echo "--- encoders ---"; \ for c in libx264 libx265 h264_nvenc hevc_nvenc libfdk_aac; do \ ffmpeg -encoders 2>/dev/null | grep -q " $c " || (echo "❌ encoder ausente: $c" && exit 1); \ echo " ✅ encoder $c"; \ done; \ echo "--- decoders ---"; \ for c in h264 hevc vp9 aac mp3 png mjpeg; do \ ffmpeg -decoders 2>/dev/null | grep -q " $c " || (echo "❌ decoder ausente: $c" && exit 1); \ echo " ✅ decoder $c"; \ done; \ echo "--- filtros ---"; \ for f in scale crop fps mpdecimate overlay format loudnorm aresample; do \ ffmpeg -filters 2>/dev/null | grep -q " $f " || (echo "❌ filtro ausente: $f" && exit 1); \ echo " ✅ filtro $f"; \ done; \ echo "✅ ffmpeg OK — todos os componentes presentes" WORKDIR /app COPY app.py . RUN pip3 install --no-cache-dir gradio EXPOSE 7860 ENV PYTHONUNBUFFERED=1 CMD ["python3", "app.py"]