Oletko koskaan toivonut voivasi esikatsella pyöräilyreittiä ennen kuin ajat sen? Rakensimme automaattisen järjestelmän, joka luo upean lentovideon jokaisen Party Onbicin ryhmäajon reitistä, ja näin pyöräilijät saavat elokuvamaisen ennakkokatsauksen siihen, mitä matkalla on odotettavissa.
Haaste
Kun järjestät pyöräilytapahtumaa tai liityt sellaiseen, reitin ymmärtäminen on ratkaisevan tärkeää. Staattiset kartat auttavat, mutta ne eivät välitä kokemusta siitä, millaista reitillä on oikeasti ajaa. Halusimme antaa käyttäjille tavan ”lentää” reitin läpi virtuaalisesti ennen kuin he sitoutuvat ajoon.
Ratkaisumme: videon renderöinti headless-selaimella
Rakensimme Node.js-palvelun, joka ajaa headless Chrome -selainta Puppeteerin avulla, renderöi reitin interaktiiviselle MapLibre GL -kartalle ja tallentaa kuvia, kun virtuaalinen kamera lentää reittiä pitkin. Näin se toimii:
1. Reitin interpolointi
Pyöräilyreitillä voi olla tuhansia koordinaattipisteitä. Jotta saamme 15 sekunnin pituisen sujuvan videon 30 FPS:n kuvataajuudella, tarvitsemme täsmälleen 450 kuvaa. Käytämme etäisyyteen perustuvaa interpolointia, jotta näytteet otetaan reitiltä tasaisesti:
| |
2. Kameran animointi tasaisella suunnalla
Jos kamera vain osoittaa kulkusuuntaan, mutkittelevilla reiteillä liike on nykivää. Tasoitamme kameran suuntaa 12 kuvan liukuvalla keskiarvolla ja käsittelemme erikseen kohdan, jossa suunta kiertyy 360°:sta 0°:een:
| |
3. Renderöinti MapLibre GL:llä
Reitti renderöidään kauniin Stadia Maps -pohjakartan päälle, ja siinä on:
- korostettu reittiviiva, jossa on näkyvyyttä parantava valkoinen reunus
- animoitu kameran sijainnin osoitin
- alku- (vihreä) ja loppumerkki (punainen)
- valinnaiset 3D-rakennukset kaupunkialueilla
4. Kuvien tallennus ja videon koodaus
Puppeteer tallentaa jokaisen kuvan PNG-kuvakaappauksena, minkä jälkeen koodaamme ne ffmpegillä WebM-videoksi VP9-koodekilla:
| |
Tekninen arkkitehtuuri
| |
- Django käynnistää videon luomisen, kun ryhmäajo luodaan tai sitä päivitetään
- Celery asettaa tehtävän jonoon asynkronista käsittelyä varten
- Node.js-renderöijä ajaa Puppeteeria ja MapLibre GL:ää
- ffmpeg koodaa tallennetut kuvat
- Video ladataan S3:een ja ryhmäajon tiedot päivitetään
Suorituskyky
| Resoluutio | Kesto | Renderöintiaika | Tiedostokoko |
|---|---|---|---|
| 1280x720 | 15 s | 60–90 s | 2–4 Mt |
| 1920x1080 | 15 s | 90–120 s | 4–8 Mt |
Tuotannossa käytämme Docker-kontteja ohjelmistorenderöinnillä (SwiftShader), jotta emme ole riippuvaisia näytönohjaimesta:
| |
Lisäämämme ominaisuudet
- Mukautettavat videon mitat: neliömuoto sosiaalisessa mediassa jakamista varten
- Logon vesileima: brändää videosi organisaatiosi logolla
- Kameran kallistus ja zoomaus: säädä katselukulmaa ja korkeutta
- Reittiviivan tyyli: omat värit ja viivan leveydet
Django-integraatio
Sovelluskoodissa videon luominen on näin yksinkertaista:
| |
Videon URL päivittyy automaattisesti, kun renderöinti valmistuu:
| |
Mitä seuraavaksi
Tutkimme useita parannuksia:
- Reaaliaikainen esikatselu: renderöinti suoraan, kun käyttäjä piirtää reittiä
- Useita kamerakulmia: sivukuvia ja kuvia suoraan ylhäältä
- Säätiedot kartalla: ennustetut olosuhteet reitin varrella
- Korkeusprofiili: nousujen ja laskujen havainnollistaminen videossa
Reittien lentovideoista on tullut yksi suosituimmista ominaisuuksistamme, ja ne auttavat pyöräilijöitä tekemään perusteltuja päätöksiä siitä, mihin ajoihin liittyä. Nykyaikaisten verkkoteknologioiden yhdistelmä muuttaa kalliin tuotantotyön automaattiseksi palveluksi, joka toimii tarpeen mukaan.
Haluatko kokeilla? Luo ryhmäajo, niin reittivideosi luodaan automaattisesti!
