Anime Upscaling: pipeline self-hosted pra reviver coleção de DVD em 4K
Tenho uma coleção decente de animes antigos em DVD encostada e uma TV moderna que faz qualquer 480i parecer pintura a dedo. A vontade era óbvia: subir esses episódios pra uma resolução e framerate dignos de 2026 sem ter que recodificar à mão por meses.
Quem me deu o primeiro empurrão foi o post do Akita on Rails sobre upscaling de anime velho com I.A. — vale muito a leitura, é onde eu entendi como o video2x resolve o pulo de qualidade. O problema é que o fluxo dele resolve um vídeo por vez. Pra processar uma coleção inteira (centenas de episódios) faltava pipeline reusável, fila, UI e — talvez o mais importante — uma etapa final de otimização com FFmpeg pra não estourar o storage.
Foi pra preencher essa lacuna que escrevi o Anime Upscaling, e hoje ele tá aberto no GitHub: <REPO_URL>.
O que é
Um app self-hosted (Docker Compose) que roda um pipeline de três etapas em fila, com UI web pra criar, salvar e disparar os jobs:
Upscale → Interpolation → Optimization
(video2x) (RIFE) (FFmpeg)
Sobe com docker compose up -d e abre em http://localhost:4750. Funciona sem GPU pra brincar, mas brilha mesmo é com NVIDIA — overlay docker-compose.nvidia.yml faz o passthrough do Container Toolkit e o pipeline usa as GPUs em paralelo.
O pipeline
Cada estágio é um worker isolado, com flags próprias e logs separados. A saída de um vira a entrada do próximo, em pastas canônicas (data/input → data/output → data/interpolated → data/optimized).
1. Upscale — video2x
Aumenta a resolução com modelo ML. O wrapper expõe três processadores: realesrgan (default, com modelos realesr-animevideov3 / realesrgan-plus-anime), realcugan e libplacebo (Anime4K-v4 via shaders). Escala 2x/3x/4x e níveis de denoise configuráveis.
2. Interpolation — RIFE
Dobra ou triplica o framerate gerando frames intermediários. Modelos suportados: rife-v4.6, rife-v4.26, rife-UHD, entre outros. Tem --scene-thresh configurável pra não inventar frame em corte de cena — aquele artefato característico de interpolação ruim.
3. Optimization — FFmpeg
Esse é o estágio que justifica a sigla “pipeline” no nome. Sem ele, o resultado do video2x sai gigante. Default: libx265 10-bit, tune animation, com 4 presets de qualidade mapeados como ultra/alta/media/baixa (CRF 16/19/22/26). Quando GPU_VENDOR é setado, troca pra hevc_nvenc / h264_amf / hevc_qsv e usa o encoder de hardware:
ffmpeg -hwaccel cuda -i in.mkv \
-c:v hevc_nvenc -preset fast -rc vbr \
-crf 19 -pix_fmt yuv420p10le out.mkv
Resultado típico: arquivo final com qualidade visual praticamente igual à do upscale puro, mas em uma fração do tamanho — viável pra biblioteca inteira no NAS.
Por que não foi só um script
A maior parte do trabalho não foi rodar video2x, foi tudo em volta. Os destaques que justificam ter UI:
- Pipelines salvos e reusáveis. Você define “DVD anime → 4K HEVC 10-bit CRF 19” uma vez e dispara em fila inteira de episódios.
- Fila multi-GPU com streams configuráveis.
GPU_COUNT × STREAMS_PER_GPUslots, com dispatch interleaved entre as GPUs (a 1ª job vai pra GPU 0, a 2ª pra GPU 1, e assim por diante). - GPU health monitor. Sonda
nvidia-smi -Lperiodicamente; se o driver wedga (Xid 119, GSP RPC timeout — quem tem RTX da série 50 conhece), o dispatch trava antes de empilhar processos zumbi. Aprendi isso na marra no post anterior, resgatando meu TrueNAS. - Skip detection + ETA. Antes de rodar, o pipeline detecta etapas cujo output já existe e pula. Durante a execução, calcula tempo restante a partir de frame/fps reais (não estimativa cega).
- Log viewer tabular ao vivo. Colunas timestamp / fonte (
GPU0-S1,FFMPEG-1,PIPELINE) / nível (OK,ERRO,SKIP,WARN,STEP) / mensagem, via WebSocket. Dá pra filtrar por GPU pra debugar quando uma trava e a outra não. - Browser de arquivos. Vê
input/,output/,interpolated/,optimized/direto na UI sem precisarsshno servidor.
Stack
| Componente | Tecnologia |
|---|---|
| Frontend | Next.js (porta 4750) |
| API | Go (porta 4751) |
| Upscaler | video2x (real-esrgan / real-cugan / libplacebo) |
| Frame interp. | RIFE (rife-v4.6, rife-v4.26, rife-UHD) |
| Encoder final | FFmpeg (libx265 10-bit padrão, NVENC/AMF/QSV opcional) |
| Deploy | Docker Compose + overlay NVIDIA opcional |
Como rodar
cp .env.example .env
mkdir -p data/input data/output data/optimized data/interpolated data/temp
# Sem GPU
docker compose up -d --build
# Com NVIDIA
docker compose -f docker-compose.yml -f docker-compose.nvidia.yml up -d --build
Abra http://localhost:4750, jogue os vídeos em data/input/, e os resultados saem em data/optimized/ (ou nas outras pastas dependendo do pipeline). Antes de expor pra rede, troque AUTH_PASSWORD e AUTH_SECRET no .env — o gate de senha único é só pra uso doméstico atrás de VPN/HTTPS.
Fechamento
Fica aberto no GitHub sob MIT: <REPO_URL>. Se você também tem um pé de DVD de anime na estante, ou uma RTX da série 50 ociosa esperando carga, dá pra subir num fim de semana e processar a coleção inteira sem virar full-time encoder.
Ideias bem-vindas: novos modelos pro upscale, presets de qualidade ajustados pra outros estilos (não só animação), integração com Sonarr/Radarr pra rodar como post-process automático. Issue ou PR — qualquer coisa serve.
Crédito de novo ao Akita on Rails pelo empurrão inicial. Se quiser trocar figurinha sobre upscaling, encoders ou homelab em geral, chama. 🦥