Oletko koskaan miettinyt, mitä tavarat tekevät öisin kun et ole niitä katsomassa? Tietysti ne liikkuvat itsekseen vastoin omistajansa tahtoa. Katsokaa vaikka:

Hacklabin työpajan katossa on valvontakamera, jonka pääasiallinen käyttötarkoitus on tietysti omaisuusvahinkojen selvittäminen ja ennaltaehkäisy. Valvontakameroiden rekisteriselosteessa on määritelty tarkasti mihin materiaalia saa käyttää, joten kun tekee mieli hassutella materiaalilla, tulee tämän tukea rekisterinpidon tavoitetta eikä myöskään paljastaa yksityisyyden piiriin kuuluvia asioita.

Ihmiset liikkuvat yleensä päivisin, joten ihmisten osumista materiaaliin voi minimoida ajoittamalla materiaalin käsittely aikaiseen aamuun, tässä tapauksessa meidän systemd-ajastin sanoo seuraavaa:

[Timer]
OnCalendar=06:07
RandomizedDelaySec=15m

Kuva siis napataan hiukan satunnaistettuna kerran päivässä. Kuvan rakeisuutta ja vuodenaikojen vaihtelusta johtuvaa valoisuuden vaihtelua on vähennetty siten, että automaatioväylän kautta komennetaan valot päälle kuvauksen ajaksi. Lisäksi kohinaa vähennetään nappaamalla 25 kuvaa ja laskemalla niistä mediaani. Mediaani on hyvä keskiluku, koska esimerkiksi välähdykset poistuvat kokonaan, toisin kuin aritmeettista keskiarvoa käytettäessä.

Tässä hiukan anonymisoitu skripti näyttää, miten onnistuu RTSP-striimistä kuvien nappaaminen mediaanin laskemista varten.

#!/bin/sh -eu

frames=25
target=.
cd "`dirname $0`"

capture () {
    tmpdir="`mktemp -d`"
    cd "$tmpdir"
    ffmpeg -nostdin -y -rtsp_transport tcp -i "rtsp://██████████/$1" -vframes $frames "%03d.png"
    convert -evaluate-sequence median *.png out.jpg
    cd -
    mkdir -p "$target/$2"
    mv "$tmpdir/out.jpg" "$target/$2/`date -Isec`.jpg"
    rm -r "$tmpdir"
}

lights () {
    val="${1-false}" jq -nc '{"method":"w", "params": {valokuvaus: env.val | fromjson}}' | nc -NU ██████████
}

trap lights exit int
lights true
capture ██████████ paja


Tämä skripti naputeltiin kasaan viime talvena ja sen jälkeen se on naksuttanut tasaista tahtiaan.

Tänään illalla tuli kuitenkin polttava tarve saada timelapse-video aikaan tähän mennessä otetusista kuvista. Ennen videon renderöintiä katsoin vielä kuvat läpi, ettei niissä esiinny mitään henkilötiedoiksi rinnastettavia asioita tai ihmisiä. Tämän jälkeen kuvat lähetetään jälleen ffmpeg:n, yhden maailman hienoimman sovelluksen, mankeloitavaksi.

#!/bin/sh -eu

fps=7
intro_len=4.5
music_end=115.1

mydir() {
    echo "`dirname "$0"`/$1"
}

finder() {
    find "`mydir paja`" -maxdepth 1 -type f -iname '*.jpg' "$@"
}

last_frame="`finder -print0 | sort -rz | head -zn 1`"
frames=`finder -printf X | wc -c`
intro_frames=`echo "scale=0;$intro_len * $fps / 1" | bc`
total_len=`echo "scale=2;($intro_frames + $frames) / $fps" | bc`
music_shift=`echo "scale=2;$music_end - $total_len" | bc`

{
    # Add intro screen
    for foo in `seq $intro_frames`; do
	cat "`mydir timelabse-main.jpg`"
    done
    # The actual frames
    finder -print0 | sort -z | xargs -0 cat
    # Trailing frames
    for foo in `seq $fps`; do
	cat "$last_frame"
    done
} | nice ionice ffmpeg -i "`mydir yakety-sax.m4a`" -itsoffset $music_shift \
	 -framerate $fps -f image2pipe -i - \
	 -af "afade=t=in:st=$music_shift:d=$intro_len" -r $fps \
	 -c:v libx264 -pix_fmt yuv420p -ss $music_shift /tmp/timelabse.mp4

Olisihan siinä ehkä päässyt muutamalla find-komennon suorittamisella vähemmän hiukan paremmin suunnittelemalla. Renderöinnin tuloksena muodostuu video, jossa musiikki aina loppuu viimeiseen kehykseen, mutta sen alkukohtaa säädetään. Tässä meni ehdottomasti suurin osa ajasta, koska ffmpeg:n itsoffset toimii hiukan yllättävästi. Ohjeita voi koettaa lukea, mutta en ole varma, oliko siitä hyötyä.

Niin, miten se tavoitteiden toteutuminen sitten? Tilavastaava varmasti tekee tästä itseäni tarkempia huomioita, mutta noin nopeasti katsoen videosta voi ainakin päätellä jotakin laitteiden käyttöasteesta ja tilan käyttösääntöjen noudattamisen tasosta. Pajan käyttäjät osaavat ainakin siivota jälkensä paremmin kuin kerhohuonetta käyttävät, vaikka parannettavaa vieläkin on.

Ja se rullajaloilla varustettu pöytä. Aika liikkuvaa sorttia. ALTER TABLE.