Plano 3c — Match Segmentation Pipeline

Do replay bruto
ao corte publicado.
Sem você tocar.

Pipeline autônomo que detecta partidas dentro da sua gravação de tela, identifica quem ganhou, e gera cortes prontos pra publicar. Roda 24/7 no Cloud Run. Custo: $0/mês no free tier.

5
Brutos processados
6
Cortes gerados
100%
Accuracy timestamps
$0/mês
Custo operacional
01 — Pipeline

5 etapas. Cada uma com seu propósito.

O bruto chega ao R2 e desce a esteira sozinho. Cada etapa é independente, observável e tolerante a falha.

L0 → L1

Ingestão

Upload do gameplay bruto pro R2.

Você upa screen-XXXX.mp4 no bucket cortes-brutos. Worker do Cloudflare insere uma linha em replay com estado recebido. O resto acontece sozinho.
L1 → L2

Análise

cv2 segmenta. Gemini enriquece.

O Cloud Run Job cortes-analyzer-job roda a cada hora, baixa o bruto, extrai frames @ 1fps e detecta as partidas via cv2.matchTemplate de 6 sinais visuais. Pra cada partida segmentada, manda um recorte light (1080p, 5 Mbps) pro Gemini 2.5 Flash que retorna nomes/coroas/narrativa em JSON.
L2 → L3

Corte

ffmpeg final, 60s, MP4 faststart.

O Cloud Run Service cortes-cutter pega cada partida pendente_corte, corta os últimos 60s via -ss / -t / -c copy, normaliza pra h264 baseline + AAC + faststart, e sobe pro bucket cortes-prontos. Estado vira cortada.
L3 → UI

Console

Admin Next.js, visualiza tudo.

App Next.js (auth via NextAuth) com 2 abas. Brutos mostra cada upload com estado, frames analisados, partidas detectadas e player do bruto inteiro. Cortes mostra cada corte cortado com placar, vencedor, link pro bruto de origem e player do recorte final.
UI → Mídia

Publicação

Ainda manual. Vai automatizar.

Hoje, você revisa no Console, baixa o corte e posta. Próximo plano (3d): roteiro automático de título/hook/hashtags via LLM com base na analise_jsonb do Gemini, e fila de publicação multi-plataforma.
02 — Stack

A melhor opção em cada camada.

Nada de "popular". A melhor.

Compute
  • Cloud Run Jobs
    analyzer (8 GiB / 30 min timeout)
  • Cloud Run Service
    cutter (2 GiB / 300s)
  • Cloud Scheduler
    cron 0 * * * * (1 bruto / hora)
Detecção
  • cv2.matchTemplate
    6 templates calibrados (1080p)
  • Gemini 2.5 Flash
    enriquecimento (nomes, coroas, narrativa)
  • ffmpeg
    scale + downsize light pra Gemini (5 Mbps)
Storage
  • Cloudflare R2
    3 buckets — bronze / silver / gold
  • Supabase Postgres
    replay → partida → corte (FK encadeadas)
  • Secret Manager
    DB URL, R2 keys, Gemini API key
Console
  • Next.js 15
    App Router, Server Components
  • NextAuth (AuthJS)
    login antes de qualquer rota
  • Tailwind + Radix
    dark-first, editorial typography
Observabilidade
  • Cloud Logging
    JSON structured, 1 log por tick
  • analise_jsonb
    audit trail completo por bruto
  • Lease + retry
    FOR UPDATE SKIP LOCKED + auto-libera 30min
Qualidade
  • 31 testes pytest
    heurísticas, FFmpeg, OCR
  • Ground truth manual
    RDX validou cv2 frame por frame
  • RLS no Supabase
    defesa em profundidade contra anon key
03 — Resultados

6 cortes. Cada um validado.

5 brutos processados em produção. Detector cv2 100% acertou os timestamps de cada partida. Análise visual final confirmou placares.

#
Bruto / Partida
Resultado
Placar
Oponente
01
screen-20251222-015755 · P1
49s → 274s · 3min 45s
Derrota
1 × 2
Garcia
02
screen-20251222-015755 · P2
304s → 354s · 50s
Vitória
3 × 0
Francisco
03
screen-20251222-142505 · P1
32s → 224s · 3min 12s
Derrota
0 × 3
Yadnik10
04
screen-20251222-153858 · P1
0s → 284s · 4min 44s
Derrota
? × 2
Alexis
05
screen-20260203-004238 · P1
0s → 152s · 2min 32s
Vitória
2 × 1
bRan
06
screen-20251121-001631 · P1
0s → 206s · 3min 26s · tempo extra
Vitória
3 × 2
its me
Ground truth — bruto 015755

RDX assistiu o bruto inteiro e anotou as 2 partidas manualmente (Garcia 2×1 derrota em tempo extra; Francisco 3×0 vitória 3 coroas).

P1 · GT [48s → 272s]cv2 [49s → 274s] ±2s
P2 · GT [304s → 354s]cv2 [304s → 354s] ±0s
Heurísticas que funcionaram
  • Matchmaking VS como âncora de início
  • "Fim da partida!" como sinal de fim universal
  • Partida implícita quando bruto começa no meio
  • Partida implícita quando bruto NÃO tem nenhum sinal mas tem >30s
  • cv2 conservador: indeterminado > chute
04 — Roadmap

O que vem a seguir.

Live
3c — Detecção + Híbrido cv2 + Gemini
Esteira completa rodando em produção. 5 brutos processados, 6 cortes gerados.
Próximo
3d — Roteiro IA
Título + hook + hashtags gerados automaticamente via LLM com base no analise_jsonb (nome do oponente, modo de fim, jogada decisiva).
Em seguida
3e — Detecção semântica via Gemini
Identificar momento decisivo dentro da partida (push da vitória, defesa heroica) pra cortar não os últimos 60s mas os 60s certos.
Futuro
4 — Publicação multi-plataforma
Fila TikTok / Shorts / Reels com hash do conteúdo pra evitar duplicata. API de cada plataforma + observabilidade do alcance.
Visão
5+ — Outras verticais
Multi-tenant nativo desde o dia zero. CR é só a primeira vertical. Próximas: Fortnite, Valorant, futebol amador, podcasts.