CamOnRoad

Allikas: Tipikate Rattamatkaklubi teabebaas
Jump to navigation Jump to search

Sissejuhatus

Tegemist on Android rakendusega, mis peaks imiteerima autokaamera funktsionaalsust nutitelefonil. Konkreetsemalt sai seda rakendust proovitud 2016. aasta Tipikate Rattamatka korraldusel, kus osad läbi jalutatud metsarajad sellega üles filmitud said.

Rakendus talletab videfailid MP4 kujul. Mingeid eraldi rajalogi faile kuskilt välja ei paista. 2018. mais sai proovitud ka ExifTool nimelise rakendusega rajalogisid otse MP4 failidest eksportida, aga tulemuseks olid tühjad GPX failid. Seega tundub, et rakendus ise GPS logi ei talleta.

Andmete järeltöötlus

Sissejuhatus

Selleks, et videokaardistamise tarbeks talletatud materjali oleks võimalik kasutada, on vajalik videofailide ja GPS logi omavaheline seostamine. Nagu ülal juba öeldud, siis see konkreetne rakendus ilmselt rajalogi üldse ei salvestagi. Kuna 2016. aastal sai aga lisaks videole talletatud paralleelselt ka rajalogi OruxMaps rakendusega, siis õnnestus 2018. aasta mais video ja rajalogi omavahel kokku viia.

Igasugusel video ja rajalogi kokkuviimisel on oluline, et:

  • Meil oleks rajalogi, milles on ajatemplid olemas ja täpsed.
  • Me teaks, mis hetkel täpselt video filmimine algas või lõppes.

Et vältida üleliigset käsitööd, siis on video ja rajalogi kokkuviimisel eelistatud kindlasti skriptitav lahendus. Uuringute tulemusena selgus, et:

  • CamOnRoad rakenduse poolt talletatakse video alguse ajatempel failinimesse, arvestades ajavööndi aega. Faili nimi on kujul VID_DD.MM.YYYY_HH_MM_SS.mp4.
  • Faili sisse EXIF info Create Date väljale kirjutatakse video lõpu aeg. Siiski on CamOnRoad tarkvaras ilmselt väike viga, sest see aeg kirjutatakse UTC ajana kohta, kust hiljem tõlgendatakse seda vööndiajana.

Kui täpselt need alguse ja lõpu ajatemplid tegeliku kellaga kokku lähevad, pole teada. OruxMaps talletab vaikimisi rajapunkte selliselt, et üksteisele liiga lähedale kahte punkti ei pane. Sellisel juhul ei ole aga hiljem interpoleerimise teel võimalik saada teada lõplikku tõde, kus punktis mingil kellaajal ikkagi oldi. Näiteks, kui inimene mingis punktid veidi aega seisis, siis hiljem sünteesitakse sinna sujuv liikumine eelmisest punktist kuni järgmise punktini. Kui CamOnRoad ka edaspidi kasutust peaks leidma, siis tasuks rajalogi talletada kas OruxMaps parema seadistusega, päris GPS seadmega ja/või filmida referentsi saamiseks lisaks mingil hetkel ka täpset kella.

Kui liita ülalkirjeldatud video algusajale video pikkus, siis see ei kattu päris 100% video lõpu ajatempliga, vaid lõpp võib olla ka kuni paar sekundit hiljem. Kumb neist õigem referents on, pole hetkel teada. Hetkel on allpool toodud näidetes eeldatud, et video tegelik algus on hoopis 3 sekundit enne faili nimes olevat ajatemplit - sellisena tundus subjektiivselt rada ja video paremini kokku minevat kui ilma selle lahutustehteta.

Rajalogi töötlemine

Sissejuhatus

Käesolev peatükk eeldab, et paralleelselt videoga talletati eraldi nutirakenduse (nt OruxMaps) või GPS seadmega ka rajalogi, see katab ära kogu filmitud aja (võib katta ka rohkem) ning seal olevad ajatemplid on talletunud ja korrektsed.

Allpool on rajalogi töötlemiseks kasutatud GPSBabel nimelist utiliiti. Kuigi GPSBabel ise on olemas nii Windowsile kui Linuxile, siis allpool toodud skript on tehtud ja proovitud Ubuntu peal.

Kui kasutajal on olemas GPX fail, kus on kaetud kogu filmitud periood, siis tuleks sellele esmalt väike eeltöötlus teha. Selleks tuleb anda järgmine käsk:

gpsbabel -t -i gpx -f all.gpx -x nuketypes,waypoints,routes -x track,pack,start=2000 -x interpolate,time=1 -o gpx -F all_interpolated.gpx

See teeb järgmist:

  • Sisend võetakse failist all.gpx ja väljund kirjutatakse faili all_interpolated.gpx.
  • Käsk viskab välja huvipunktid ja marsruudid, jättes alles ainult rajalogi.
  • Ühendab kõik rajasegmendid üheks segmendiks kokku. Eeldus on, et kattuvaid ajatempleid ei ole ning ajatemplid jooksevad alati suurenevas järjekorras. Kui see nii ei ole, võib pack asemel kasutada merge, kuid probleemide vältimiseks tasub sel juhul ka manuaalselt uurida, miks rajalogis korduvaid või ebakorrapäraseid punkte üldse leidub.
  • Viskab välja rajapunktid, mille ajatempel on varasem kui aasta 2000. Selle punkti suurem mõte on visata välja ilma ajatemplita rajapunktid.
  • Interpoleerib rajapunkte juurde, nii et kogu ajavahemik oleks 1-sekundise intervalliga kaetud.

Tasub mainida, et kui algne filmimine toimus pikema perioodi jooksul ning vahele jäi ka mitmepäevaseid (või -nädalaseid) auke, siis läheb fail all_interpolated.gpx väga suureks - sinna tekib rajapunkt kogu perioodi jaoks iga sekundi tagant. Alternatiivina on võimalik algsed logid koguda päeva kaupa erinevatesse failidesse, seejärel ükshaaval punktid juurde interpoleerida ning seejärel kõik interpoleeritud rajad üheks GPX failiks kokku monteerida (ilma uuesti interpoleerimata).

Rajalogi tükeldamine reaalsete ajatemplitega

Nüüd saab rajalogi tükeldada vastavalt videofailidele:

#!/bin/bash

EXTENSION="mp4"

while IFS= read -r -d '' -u 9
do
    DATESTR=(${REPLY//[._]/ })
    CREATEDATE=`date --date="${DATESTR[3]}-${DATESTR[2]}-${DATESTR[1]} ${DATESTR[4]}:${DATESTR[5]}:${DATESTR[6]}" +"%s"`
    DURATION=`exiftool -S -s -n -trackduration "$REPLY" | cut -d'.' -f1`
    STARTDATE=$(($CREATEDATE - 3))
    ENDDATE=$(($STARTDATE + $DURATION))
    STARTSTR=`date -u -d @"$STARTDATE" +"%Y%m%d%H%M%S"`
    ENDSTR=`date -u -d @"$ENDDATE" +"%Y%m%d%H%M%S"`
    gpsbabel -t -i gpx -f all_interpolated.gpx -x track,start=$STARTSTR,stop=$ENDSTR -o gpx -F "$(basename "$REPLY" .$EXTENSION)".gpx
done 9< <( find . -type f -iname "*.$EXTENSION" -print0 )

Tulemuseks on see, et igale mp4 failile vastab samanimeline, kuid gpx laiendiga rajalogi fail.

Rajalogi tükeldamine võltsitud ajatemplitega

Selleks, et lihtsustada videofailide vaatamist näiteks RegistratorViewer-is, võib tekkida soov ajatempleid võltsida - ehk siis liigutada GPX ajatemplid üksteise järgi nii, nagu kõik klipid oleks filmitud järjest.

Ajatemplite võltsimist võib olla vajalik kasutada ka näiteks juhul, kui videot soovitakse vaadata näiteks Garmin Virb Edit tarkvaras - sealse bugi tõttu rohkem kui ühte klippi korraga kaardile kanda ei saa. Küll aga tähendab see, et võltsitud ajatemplitega rajalogi tuleb üheks GPX failiks kokku monteerida (st mitte igale videofailile oma), samuti tuleb videod kõik üheks pikaks filmiks kokku monteerida. Hetkel siinkohal seda lähenemist ei kajasta.

NB! Kui on soov CamOnRoad abil filmitud klippe vaadata veel koos mingite muude klippidega, siis tuleks ajatemplite võltsimine jätta viimaseks sammuks ning teha ära kõigile üheskoos vaadatavatele videodele korraga - sel juhul säilib nende loogiline järjekord ajas. Seega siin toodud skripti on mõtet kasutada ainult juhul, kui selle tulemusena pannaksegi kokku lõplik kompott, mida koos vaadata soovitakse ning muid asju hiljem enam ei lisandu.

Võltsitud ajatemplitega GPX failid tekitab järgmine skript:

#!/bin/bash

# Expects video files and all_interpolated.gpx in this dir. Creates a GPX files
# for every video with faked timestamps.

EXTENSION="mp4"

while IFS= read -r -d '' -u 9
do
    DATESTR=(${REPLY//[._]/ })
    CREATEDATE=`date --date="${DATESTR[3]}-${DATESTR[2]}-${DATESTR[1]} ${DATESTR[4]}:${DATESTR[5]}:${DATESTR[6]}" +"%s"`
    CUT_START=$(($CREATEDATE-3))
    DURATION=`exiftool -S -s -n -trackduration "$REPLY"`

    if [[ -z "$FAKE_TIMESTAMP_PRECISE" ]]; then
        # The starting point for GPX file with faked timestamps is the starting
        # moment of the first video. Initialize this here.
        FAKE_TIMESTAMP_PRECISE=$CUT_START
        FAKE_TIMESTAMP_START=$CUT_START
    fi

    # Get the next boundary on the faked timeline.
    FAKE_TIMESTAMP_PRECISE=`echo "$FAKE_TIMESTAMP_PRECISE+$DURATION" | bc`

    # Round the end timestamp for cutting, but subtract 1 second from the result.
    FAKE_TIMESTAMP_END=`echo "scale=0; ($FAKE_TIMESTAMP_PRECISE - 0.5)/1" | bc`

    CUT_DURATION=$(($FAKE_TIMESTAMP_END-$FAKE_TIMESTAMP_START))
    CUT_END=$(($CUT_START+$CUT_DURATION))
    MOVE=$(($FAKE_TIMESTAMP_START-$CUT_START))
    STARTSTR=`date -u -d @"$CUT_START" +"%Y%m%d%H%M%S"`
    ENDSTR=`date -u -d @"$CUT_END" +"%Y%m%d%H%M%S"`

    gpsbabel -t -i gpx -f all_interpolated.gpx \
        -x nuketypes,waypoints,routes \
        -x track,start=$STARTSTR,stop=$ENDSTR -x track,move=${MOVE}s \
        -o gpx -F "$(basename "$REPLY" .$EXTENSION)".gpx
    FAKE_TIMESTAMP_START=$(($FAKE_TIMESTAMP_END+1))
done 9< <( find . -type f -iname "*.$EXTENSION" -print0 )

Video töötlemine

2016. aastal said videod talletatud portrait režiimis, mis pole kindlasti kõige sobivam valik. Selgus, et füüsiliselt talletatakse pilt ikkagi landscape režiimis, lihtsalt EXIF infosse lisatakse Rotation=90. Tulemuseks on see, et osad meediapleierid näitavad videot õigesti, osad mitte. VLC Player näitab õigesti, RegistratorViewer aga pööratult. Kõige lihtsam viis video ümber kodeerimiseks on ffmpeg, mille uuemad (2015+) versioonid teevad pildi automaatset pööramist lausa vaikimisi. Ehk siis pilt kodeeritakse ringi vastavalt EXIF info rotation väljale ning rotation väli ise keeratakse nulli. Kõik kaustas olevad MP4 videod keerab õigeks järgmine skript:

#!/bin/bash

EXTENSION="mp4"

mkdir -f out

while IFS= read -r -d '' -u 9
do
    ffmpeg -i "$REPLY" -c:a copy "out/$REPLY"
done 9< <( find . -type f -iname "*.$EXTENSION" -print0 )

Muud skriptid

Sissejuhatus

Siin alajaotuses olevad skriptid ei ole vajalikud selleks, et CamOnRoad rakendusega talletatud video teha vaadatavaks RegistratorViewer-is. Tegemist on skriptidega, mida sai kasutatud teema uurimise käigus ning mis võivad uuesti päevakorda kerkida, kui on soov teemat edasi arendada. Näiteks:

  • Uuring selles osas, kuidas video filmimise aeg täpsemalt teada saada.
  • Uuring selles osas, kuidas video ja rajalogi mõne muu rakenduse jaoks töödeldavaks teha.

Tööriistadena tasub lisaks eelpool juba nimetatud asjadele paigaldada kaks asja: csvtool ja ExifTool.

Neist esimese saab paigaldada lihtsalt nii:

sudo apt-get install csvtool

Teist kirjeldab eraldi artikkel.

Videofailides oleva Create Date välja seadistamine

Allpool toodud skript loeb faili nimest välja tema loomise aja ning kirjutab selle faili sisse EXIF info Create Date ja muudele sarnastele väljadele:

#!/bin/bash

EXTENSION="mp4"

while IFS= read -r -d '' -u 9
do
    DATESTR=(${REPLY//[._]/ })
    DATESTR2="${DATESTR[3]}:${DATESTR[2]}:${DATESTR[1]} ${DATESTR[4]}:${DATESTR[5]}:${DATESTR[6]}"

    exiftool "-CreateDate=$DATESTR2" \
             "-ModifyDate=$DATESTR2" \
             "-TrackCreateDate=$DATESTR2" \
             "-TrackModifyDate=$DATESTR2" \
             "-MediaCreateDate=$DATESTR2" \
             "-MediaModifyDate=$DATESTR2" $REPLY
done 9< <( find . -type f -iname "*.$EXTENSION" -print0 )

Kui on soov kasutada kuupäevana hoopis GPX failis olevat esimest ajatemplit, siis tuleks DATESTR2 muutuja koostada hoopis nii:

    CSV=`gpsbabel -t -i gpx -f "$REPLY" \
        -x nuketypes,waypoints,routes -x track,start=2000 \
        -o unicsv -F - | csvtool namedcol Date,Time -`

    DATESTRFIRST=`echo "$CSV" | awk 'NR==2' | tr ',' ' '`
    CREATEDATE=`date --utc --date="$DATESTRFIRST" +"%s"`
    DATESTR2=`date -d @"$CREATEDATE" +"%Y:%m:%d %H:%M:%S"`

Videofailidega seonduvate ajatemplite trükkimine

Siin toodud skriptid trükivad info konsooli ja neid on võimalik näiteks Excelis hiljem võrrelda.

Failide nimedest pärit ajatemplid trükib Unix Timestamp-idena välja järgmine skript:

#!/bin/bash

EXTENSION="mp4"

while IFS= read -r -d '' -u 9
do
    DATESTR=(${REPLY//[._]/ })
    date --date="${DATESTR[3]}-${DATESTR[2]}-${DATESTR[1]} ${DATESTR[4]}:${DATESTR[5]}:${DATESTR[6]}" +"%s"
done 9< <( find . -type f -iname "*.$EXTENSION" -print0 )

Failide EXIF infos olevad Create Date väljad ja videode pikkused annab järgmine skript:

EXTENSION="mp4"

while IFS= read -r -d '' -u 9
do
    CREATEDATE=`exiftool -S -s -d "%s" -createdate "$REPLY"`
    DURATION=`exiftool -S -s -n -trackduration "$REPLY"`
    echo $CREATEDATE $DURATION
done 9< <( find . -type f -iname "*.$EXTENSION" -print0 )

Video vaatamine

Praegune parim soovitus CamOnRoad rakendusega talletatud videode vaatamiseks on RegistratorViewer. Tuleb lihtsalt avada kõik töödeldud (pööratud) videofailid ning kui kaustas on kaasas ka samanimelised GPX failid, siis avaneb kõik iseenesest. Kui GPX failidena on kasutatud võltsitud ajatemplitega versioone, siis toimub kogu videologi kokku grupeerimine peale avamist automaatselt, muidu tuleb käsitsi teha (Group with...).