Ja desejou poder pre-visualizar uma rota de ciclismo antes de a percorrer? Construimos um sistema automatizado que gera belos videos de sobrevoo para cada rota de festa no Party Onbici, oferecendo aos ciclistas uma pre-visualizacao cinematografica do que esperar na sua jornada.
O Desafio
Ao organizar ou participar num evento de ciclismo, compreender a rota e crucial. Os mapas estaticos sao uteis, mas nao transmitem a experiencia de realmente percorrer a rota. Queriamos dar aos utilizadores uma forma de “sobrevoar virtualmente” a rota antes de se comprometerem com um passeio.
A Nossa Solucao: Renderizacao de Video Headless
Construimos um servico Node.js que executa um navegador Chrome headless usando Puppeteer, renderiza a rota num mapa interativo MapLibre GL e captura fotogramas enquanto uma camara virtual voa ao longo do percurso. Eis 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 fotogramas. Usamos interpolacao baseada em distancia para amostrar a rota uniformemente:
| |
2. Animacao da Camara com Orientacao Suave
Simplesmente apontar a camara na direcao de viagem cria movimentos bruscos em rotas sinuosas. Suavizamos a orientacao da camara usando uma media movel de 12 fotogramas, 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 camara
- Marcadores de inicio (verde) e fim (vermelho)
- Extrusoes opcionais de edificios 3D para areas urbanas
4. Captura de Fotogramas e Codificacao de Video
O Puppeteer captura cada fotograma como captura de ecra PNG, depois usamos ffmpeg para os codificar num video WebM com codec VP9:
| |
Arquitetura Tecnica
| |
- Django aciona a geracao de video quando uma festa e criada ou atualizada
- Celery coloca a tarefa em fila para processamento assincrono
- O renderizador Node.js executa Puppeteer com MapLibre GL
- ffmpeg codifica os fotogramas capturados
- O video e carregado para S3 e o registo da festa e atualizado
Consideracoes de Desempenho
| Resolucao | Duracao | Tempo de Renderizacao | Tamanho do Ficheiro |
|---|---|---|---|
| 1280x720 | 15s | 60-90s | 2-4 MB |
| 1920x1080 | 15s | 90-120s | 4-8 MB |
Para producao, usamos contentores Docker com renderizacao por software (SwiftShader) para evitar dependencias de GPU:
| |
Funcionalidades que Adicionamos
- Dimensoes de video personalizaveis - Formato quadrado para partilha em redes sociais
- Marca de agua com logotipo - Personalize os seus videos com o logotipo da sua organizacao
- Inclinacao e zoom da camara - 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:
| |
O URL do video e atualizado automaticamente quando a renderizacao termina:
| |
Proximos Passos
Estamos a explorar varias melhorias:
- Pre-visualizacao em tempo real - Renderizacao ao vivo enquanto os utilizadores desenham rotas
- Multiplos angulos de camara - Vistas laterais, planos aereos
- Sobreposicao meteorologica - Mostrar condicoes previstas ao longo da rota
- Perfil de elevacao - Visualizar subidas e descidas no video
Os videos de sobrevoo de rota tornaram-se uma das nossas funcionalidades mais populares, ajudando os ciclistas a tomar decisoes informadas sobre que passeios participar. A combinacao de tecnologias web modernas transforma o que teria sido uma tarefa de producao dispendiosa num servico automatizado e a pedido.
Quer experimentar? Crie uma festa e o seu video de rota sera gerado automaticamente!