Ivan Micai
← Voltar para o blog

Anime Upscaling: pipeline self-hosted pra reviver coleção de DVD em 4K

Publicado em

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/inputdata/outputdata/interpolateddata/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_GPU slots, 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 -L periodicamente; 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.input/, output/, interpolated/, optimized/ direto na UI sem precisar ssh no servidor.

Stack

ComponenteTecnologia
FrontendNext.js (porta 4750)
APIGo (porta 4751)
Upscalervideo2x (real-esrgan / real-cugan / libplacebo)
Frame interp.RIFE (rife-v4.6, rife-v4.26, rife-UHD)
Encoder finalFFmpeg (libx265 10-bit padrão, NVENC/AMF/QSV opcional)
DeployDocker 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. 🦥