Heb je ooit gewenst dat je een fietsroute kon bekijken voordat je hem rijdt? We hebben een geautomatiseerd systeem gebouwd dat prachtige flyover-video’s genereert voor elke feestroute op Party Onbici, waardoor fietsers een cinematografische preview krijgen van wat ze op hun reis kunnen verwachten.
De Uitdaging
Bij het organiseren van of deelnemen aan een fietsevenement is het begrijpen van de route cruciaal. Statische kaarten zijn nuttig, maar ze brengen niet de ervaring over van het daadwerkelijk rijden van de route. We wilden gebruikers een manier geven om virtueel “door de route te vliegen” voordat ze zich aan een rit committeren.
Onze Oplossing: Headless Video Rendering
We hebben een Node.js-service gebouwd die een headless Chrome-browser draait met Puppeteer, de route rendert op een interactieve MapLibre GL-kaart en frames vastlegt terwijl een virtuele camera langs het pad vliegt. Zo werkt het:
1. Route Interpolatie
Een fietsroute kan duizenden coordinaatpunten hebben. Om een vloeiende video te maken van 30 FPS gedurende 15 seconden, hebben we precies 450 frames nodig. We gebruiken afstandsgebaseerde interpolatie om de route gelijkmatig te samplen:
| |
2. Camera Animatie met Vloeiende Richting
Simpelweg de camera richten in de reisrichting creëert schokkerige beweging op bochtige routes. We verzachten de camerarichting met een voortschrijdend gemiddelde over 12 frames, met speciale behandeling voor de 360 graden/0 graden overgang:
| |
3. MapLibre GL Rendering
De route wordt gerenderd op een mooie Stadia Maps basislaag met:
- Een gemarkeerde routelijn met witte omtrek voor zichtbaarheid
- Geanimeerde camerapositie-indicator
- Start (groen) en finish (rood) markers
- Optionele 3D-gebouwextrusies voor stedelijke gebieden
4. Frame Capture en Video Encoding
Puppeteer vangt elk frame als PNG-screenshot, daarna gebruiken we ffmpeg om ze te encoderen in een WebM-video met VP9-codec:
| |
Technische Architectuur
| |
- Django activeert videogeneratie wanneer een feest wordt aangemaakt of bijgewerkt
- Celery plaatst de taak in de wachtrij voor asynchrone verwerking
- Node.js renderer draait Puppeteer met MapLibre GL
- ffmpeg encodeert de vastgelegde frames
- Video wordt geupload naar S3 en het feestrecord wordt bijgewerkt
Prestatie Overwegingen
| Resolutie | Duur | Rendertijd | Bestandsgrootte |
|---|---|---|---|
| 1280x720 | 15s | 60-90s | 2-4 MB |
| 1920x1080 | 15s | 90-120s | 4-8 MB |
Voor productie gebruiken we Docker-containers met software rendering (SwiftShader) om GPU-afhankelijkheden te vermijden:
| |
Functies die We Hebben Toegevoegd
- Aanpasbare video-afmetingen - Vierkant formaat voor delen op sociale media
- Logo watermerking - Merk je video’s met het logo van je organisatie
- Camera kantel en zoom - Pas de kijkhoek en hoogte aan
- Routelijn styling - Aangepaste kleuren en breedtes
Django Integratie
Vanuit de applicatiecode is het genereren van een video zo simpel als:
| |
De video-URL wordt automatisch bijgewerkt wanneer het renderen is voltooid:
| |
Volgende Stappen
We onderzoeken verschillende verbeteringen:
- Real-time preview - Live renderen terwijl gebruikers routes tekenen
- Meerdere camerahoeken - Zijaanzichten, bovenaanzichten
- Weer overlay - Toon voorspelde omstandigheden langs de route
- Hoogteprofiel - Visualiseer klimmen en dalen in de video
Route flyover-video’s zijn een van onze populairste functies geworden en helpen fietsers weloverwogen beslissingen te nemen over welke ritten ze willen doen. De combinatie van moderne webtechnologieen maakt van wat een dure productietaak zou zijn geweest een geautomatiseerde, on-demand service.
Wil je het uitproberen? Maak een feest aan en je routevideo wordt automatisch gegenereerd!