Ja desejou poder visualizar uma rota de ciclismo antes de pedalar? Construimos um sistema automatizado que gera lindos videos de sobrevoo para cada rota de festa no Party Onbici, oferecendo aos ciclistas uma visualizacao cinematografica do que esperar em sua jornada.
O Desafio
Ao organizar ou participar de um evento de ciclismo, entender a rota e crucial. Mapas estaticos sao uteis, mas nao transmitem a experiencia de realmente percorrer a rota. Queriamos dar aos usuarios uma forma de “sobrevoar virtualmente” a rota antes de se comprometerem com um passeio.
Nossa Solucao: Renderizacao de Video Headless
Construimos um servico Node.js que executa um navegador Chrome headless usando Puppeteer, renderiza a rota em um mapa interativo MapLibre GL e captura quadros enquanto uma camera virtual voa ao longo do percurso. Veja como funciona:
1. Interpolacao da Rota
Uma rota de ciclismo pode ter milhares de pontos de coordenadas. Para criar um video suave a 30 FPS durante 15 segundos, precisamos de exatamente 450 quadros. Usamos interpolacao baseada em distancia para amostrar a rota uniformemente:
| |
2. Animacao da Camera com Orientacao Suave
Simplesmente apontar a camera na direcao de viagem cria movimentos bruscos em rotas sinuosas. Suavizamos a orientacao da camera usando uma media movel de 12 quadros, com tratamento especial para a transicao de 360 graus/0 graus:
| |
3. Renderizacao MapLibre GL
A rota e renderizada sobre uma bela camada base Stadia Maps com:
- Uma linha de rota destacada com contorno branco para visibilidade
- Indicador animado de posicao da camera
- Marcadores de inicio (verde) e fim (vermelho)
- Extrusoes opcionais de predios 3D para areas urbanas
4. Captura de Quadros e Codificacao de Video
O Puppeteer captura cada quadro como captura de tela PNG, depois usamos ffmpeg para codifica-los em um video WebM com codec VP9:
| |
Arquitetura Tecnica
| |
- Django aciona a geracao de video quando uma festa e criada ou atualizada
- Celery coloca a tarefa na fila para processamento assincrono
- O renderizador Node.js executa Puppeteer com MapLibre GL
- ffmpeg codifica os quadros capturados
- O video e enviado para S3 e o registro da festa e atualizado
Consideracoes de Performance
| Resolucao | Duracao | Tempo de Renderizacao | Tamanho do Arquivo |
|---|---|---|---|
| 1280x720 | 15s | 60-90s | 2-4 MB |
| 1920x1080 | 15s | 90-120s | 4-8 MB |
Para producao, usamos containers Docker com renderizacao por software (SwiftShader) para evitar dependencias de GPU:
| |
Funcionalidades que Adicionamos
- Dimensoes de video personalizaveis - Formato quadrado para compartilhamento em redes sociais
- Marca d’agua com logo - Personalize seus videos com o logo da sua organizacao
- Inclinacao e zoom da camera - Ajuste o angulo de visao e a altitude
- Estilo da linha de rota - Cores e larguras personalizadas
Integracao com Django
A partir do codigo da aplicacao, gerar um video e tao simples como:
| |
A URL do video e atualizada automaticamente quando a renderizacao termina:
| |
Proximos Passos
Estamos explorando varias melhorias:
- Visualizacao em tempo real - Renderizacao ao vivo enquanto os usuarios desenham rotas
- Multiplos angulos de camera - Vistas laterais, tomadas aereas
- Sobreposicao de clima - Mostrar condicoes previstas ao longo da rota
- Perfil de elevacao - Visualizar subidas e descidas no video
Os videos de sobrevoo de rota se tornaram uma de nossas funcionalidades mais populares, ajudando os ciclistas a tomar decisoes informadas sobre quais passeios participar. A combinacao de tecnologias web modernas transforma o que teria sido uma tarefa de producao cara em um servico automatizado sob demanda.
Quer experimentar? Crie uma festa e seu video de rota sera gerado automaticamente!