Zeniitti

Tähtiharrastuksen verkkolehti

Taivaskameraprojekti – kuinka automatisoida timelapse-video taivaskameran videostreamista

Taivaskameraprojekti – kuinka automatisoida timelapse-video taivaskameran videostreamista

Antti Rinne

Olin jo pidempään suunnitellut, että hankin vielä yhden valvontakameran kotiin, mutta tällä kertaa suuntaankin sen taivaalle. Ideana oli, että
enää ei harmittaisi aamulla huomata Taivaanvahdista, että yöllä oli eeppiset revontulet menneet ohi, kun olin nukkumassa.
Taivaanvahdin kautta sain tietooni, että TP-Link Tapo C325WB -valvontakamera on erityisen valoherkkä ja soveltuu pimeän ajan tapahtumien
taltiointiin. Kamera sattui olemaan yhdessä verkkokaupassa sopivasti tarjouksessakin, niin ei muuta kuin tilaukseen.

Kameran asentaminen paikalleen olikin sitten oma episodinsa. Asennuspaikaksi valitsin autokatoksen korkean päädyn, josta avautuu maisema kutakuinkin pohjoiseen. Siihen oli mahdollista asentaa kamera niin ylös, että katuvalot ja vastapäisen naapurin autokatoksessa läpi yön palavat kirkkaat valot jäivät kameran alapuolelle. Halusin asentaa kameran siten, että se on räystään alla vähän sääsuojassa, mutta kuitenkin siten että taivasta näkyy mahdollisimman paljon. Askartelin puusta kameralle sen verran jatkotelinettä, että linssi jää vielä juuri ja juuri räystään alle.

Ajatuksena tässä on, että linssi pysyy puhtaana eikä huurtuisi pakkasella. Aika näyttää kuinka käy. Keksin myös, että katolle kiipeilyn sijasta voin hyödyntää autokatoksen välikattoa. Leikkasin päädyn laudoituksesta palan, palaan isompi levy taakse ja etupuolelle kamerateline. Koko komeus sitten ruuveilla sisäpuolelta kiinni. Oheinen valokuva selventänee millainen viritys on kyseessä.

TP-Linkin kameran käyttöönotto tapahtuu kameran omalla sovelluksella. Sovellus opastaa käyttäjää selkeästi eikä siinä ole mitään ihmeellistä.
Kameraan saa asennettua muistikortin, johon kamera tallentaa joko liikkeestä tai jatkuvasti ajastettuna. Kamera on liitettävissä ONVIF-
protokollalla myös verkkotallentimeen, jos sellainen on käytettävissä. Asetin kameran tallentamaan jatkuvasti yön ajaksi. Olikohan sitten jo ensimmäinen tai toinen yö, kun kamera olikin tallentanut komeat revontulet.

Tässä vaiheessa havaitsin kameran ominaisuuksissa oleellisen puutteen. Nimittäin, vaikka kameran liiketunnistuksen yhteydessä tallentamat
lyhyet pätkät saa puhelinsovelluksen kautta tallennettua, ajastettujen tallennusten osalta se ei ole mahdollista. Sovelluksessa on kyllä
mahdollisuus katsoa tallennetta joko normaalinopeudella, hidastettuna tai jopa 16-kertaiseksi nopeutettuna. Ja samalla kun katsoo tallennetta, sitä voi tallentaa puhelimen sovellukselle puhelimen muistiin videona tai siitä voi tallentaa myös snapshotteja. Ei kovin kätevää.

Koko ajastetun tallenteen voisi siirtää koneelle myös ottamalla muistikortti kamerasta, mutta kun kameran asennuspaikka on työläästi saavutettavissa, tämäkään vaihtoehto ei houkuttanut.

Ajattelin, että olisi kätevää jos voisi saada tietokoneelle snapshotteja yön videosta tasaisin välein, jotta voisi sitten hyödyntää joko yksittäisiä kuvia tai tehdä niistä timelapse-video. Aikani asiaa selviteltyäni, tuli vastaan keino käyttää VLC -mediasoitinta (https://www.videolan.org/) kuvakaappausten nappaamiseen, kunhan kamerasta on vain saatavilla ulos ns. RTSP-striimi (Real Time Streaming Protocol).

Timelapse-videoita olin tehnyt aiemmin erillisellä sovelluksella, mutta ajattelin että sekin prosessi olisi kätevä automatisoida. Ideana oli, että voisin aamulla herättyäni mennä koneelta katsomaan millaisen timelapse-videon se on luonut. Googlen avulla selvisi, että timelapse-videon teko pelkästään komentokehotteelta ajamalla onnistuu esim. FFMPEG-ohjelmalla (https://ffmpeg.org/). VLC:n tai FFMPEGin asentamiseen tai käyttöön ei sen kummemmin puututa tässä artikkelissa, vaan keskitytään siihen miten niitä hyödynnetään tässä taivaskameraprojektissa.

Kun aloin syventymään aiheeseen tarkemmin, verkosta löytyi kyllä paljon valmiita koodinpätkiä miten homma hoituu Linux-puolella, mutta Windowsin komentokehotteella toteutettavia ratkaisuja ei niinkään. Lopulta ankaran googlailun ja ChatGPT:n avustuksella sain koodin vihdoin toimimaan haluamallani tavalla. Koska hommassa oli kohtuullisesti vaivaa, ajattelin että voisin jakaa koodin vähän laajemmallekin yleisölle ja sen takia tämä artikkeli on kirjoitettu.

 

Kameran koodaus

Mutta vihdoin itse asiaan, eli koodiin. Koodi perustu MS-DOS komentokieleen, joka tunnetaan nimellä Batch. (Lisätietoja https://fi.wikipedia.org/wiki/.BAT ). Koodi tallennetaan tavallisena tekstitiedostona, jonka tiedostopääte on .bat. Editoinnin voi tehdä vaikka Notepadilla, mutta itse käytän ohjelmaa nimeltä Visual Studio Code, joka näyttää koodissa erityyppiset asiat eri väreillä.

Koodi löytyy kokonaisuudessaan tästä alta. Koodin toimintaa on selitetty kommenteissa (rivit jotka alkavat ::) mutta alempana koodiosion jälkeen selitän toimintaa hieman tarkemmin osioittain.

@ECHO OFF
ECHO.
ECHO This creates a timelapse video from the RTSP stream using VLC and FFMPEG
ECHO Start time %TIME%
ECHO Timestamps helps you with debugging, if something goes wrong
ECHO.
SETLOCAL ENABLEDELAYEDEXPANSION
:: Use WMIC to retrieve date and time
FOR /F “;skip=1 tokens=1-6” %%A IN (‘WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year^ /Format:table’) DO (
IF NOT “%%~F”==”;” (
SET /A Year=%%F
SET /A Month=100+%%D
SET /A Day=100+%%A
SET /A Hour=100+%%B
SET /A Minute=100+%%C

:: Remove leading 1 from Month, Day, Hour, and Minute to format them correctly
SET Month=!Month:~1!
SET Day=!Day:~1!
SET Hour=!Hour:~1!
SET Minute=!Minute:~1!
:: Format now as YYYY-MM-DD_HHMM
SET now=!Year!-!Month!-!Day!_!Hour!!Minute!
)
)
:: Display the result
ECHO Creating a directory TimeLapse%now% for images
ECHO.
:: Create directory for captured images, change path for your own, but remember to use %now% variable
mkdir “D:\Timelapse\TimeLapse%now%”
:: Start VLC with specified parameters
ECHO Running VLC for 8 hours (28800 seconds)
ECHO A picture is taken every 6 seconds (every 120 frames)
ECHO Streaming started at %TIME%
:: change the path of VLC and the RTSP address of the camera to your own
“C:\Program Files\VideoLAN\VLC\vlc.exe” rtsp://tunnus:salasana@192.168.1.2:554/stream1 –video-filter=scene –scene-
prefix=img- –scene-format=jpg –scene-path=”D:\Timelapse\TimeLapse%now%” –scene-ratio 120 –run-time 28800 vlc://quit
ECHO Streaming on VLC stopped at %TIME%
ECHO.
ECHO Renaming files so that they have continuous numbering.
ECHO Files are organized by time first.
ECHO Otherwise renaming can go wrong.
:: Set the path to the target directory
SET targetDir=”D:\Timelapse\TimeLapse%now%”
:: Set the starting number
SET /A counter=1

:: List all .jpg files in the target directory sorted by date and pass them to the loop
FOR /F “tokens=*” %%F IN (‘DIR /B /O:D %targetDir%\*.jpg’) DO (
:: Format the counter to five digits with leading zeros
SET formatted_num=00000!counter!
SET formatted_num=!formatted_num:~-5!
:: Rename the file
REN “%targetDir%\%%F” “img!formatted_num!.jpg”
:: Increment the counter
SET /A counter+=1
)
ECHO Renaming done at %TIME%
ECHO.
ECHO Running FFMPEG
:: 3 sec delay to give enough time to read what is above
choice /T 3 /C YN /N /M “.” /D Y
:: change paths for your own
“D:\Timelapse\ffmpeg\bin\ffmpeg.exe” -framerate 30 -i “D:\Timelapse\TimeLapse%now%\img%%05d.jpg” -s:v 1910×1080 -c:v libx264 –
crf 22 -preset slower -pix_fmt yuv420p “D:\Timelapse\Timelapse_%now%.mp4”
ECHO.
ECHO Video was completed at %TIME%
ENDLOCAL

Seuraavaksi hieman mitä eri osiot tekevät:
@ECHO OFF
ECHO.
ECHO This creates a timelapse video from the RTSP stream using VLC and FFMPEG
ECHO Start time %TIME%
ECHO Timestamps helps you with debugging, if something goes wrong

@ECHO OFF estää komentojen tulostamisen komentoriville (tai skriptin ajon yhteydessä), joten näet vain komennon tuottamat tulokset, et itse komentoja. Tämä tekee skriptin suorittamisesta siistimpää ja vähemmän sekavaa. @-merkki alussa estää ECHO OFF -komennon näkymisen.

ECHO. tekee tyhjän rivin ja kun ECHO käskyn perään kirjoittaa jotain, näkyy ko. teksti komentokehotteessa. Koodissani on aika paljon ajon aikana annettavia selitteitä, jotta pysyn paremmin kärryillä siitä missä vaiheessa ohjelma on. Koska ohjelma ajaa itseään yöllä, olen lisännyt muutamaan kohtaan rivit jossa komentokehotteeseen tulostetaan %TIME% muuttujan avulla sen hetkinen kellonaika. Jos ohjelma on lopettanut toimintansa, aikaleimoista voi alkaa tutkimaan mistä se johtuu (onko esimerkiksi kameran streami katkennut jostain syystä).

SETLOCAL ENABLEDELAYEDEXPANSION
Tämä liittyy koodissa käytettäviin ympäristömuuttujin. En osaa itsekään täysin selittää, mutta FOR-silmukan toiminta edellyttää tätä
FOR /F “skip=1 tokens=1-6” %%A IN (‘WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year^ /Format:table’) DO
(
IF NOT “%%~F”==”;” (
SET /A Year=%%F
SET /A Month=100+%%D
SET /A Day=100+%%A
SET /A Hour=100+%%B
SET /A Minute=100+%%C
:: Remove leading 1 from Month, Day, Hour, and Minute to format them correctly
SET Month=!Month:~1!
SET Day=!Day:~1!
SET Hour=!Hour:~1!
SET Minute=!Minute:~1!
:: Format now as YYYY-MM-DD_HHMM
SET now=!Year!-!Month!-!Day!_!Hour!!Minute!
)
)
Tämä pitkä pätkä koodia tarvitaan jotta saadaan aikaiseksi muuttuja nimeltä ”now” joka sisältää tämänhetkisen ajan muodossa YYYY-MM-DD_HHMM. Tätä käytetään muodostamaan nimi kansiolle johon videostriimistä kaapatut kuvat tallennetaan.

:: Display the result
ECHO Creating a directory TimeLapse%now% for images

ECHO.
:: Create directory for captured images, change path for your own, but remember to use %now% variable
mkdir “D:\Timelapse\TimeLapse%now%”
ECHO:n avulla näytetään minkä nimistä kansiota ollaan luomassa. Tästä voi siis samalla katsoa, mistä kuvat pitäisi löytyä.
MKDIR komento luo kansion. Muuta tuo ”D:\Timelapse\TimeLapse” osio oman tarpeesi mukaiseksi.

:: Start VLC with specified parameters
ECHO Running VLC for 8 hours (28800 seconds)
ECHO A picture is taken every 6 seconds (every 120 frames)
ECHO Streaming started at %TIME%
:: change the path of VLC and the RTSP address of the camera to your own
“C:\Program Files\VideoLAN\VLC\vlc.exe” rtsp://tunnus:salasana@192.168.1.2:554/stream1 –video-filter=scene –scene-
prefix=img- –scene-format=jpg –scene-path=”D:\Timelapse\TimeLapse%now%” –scene-ratio 120 –run-time 28800 vlc://quit
ECHO Streaming on VLC stopped at %TIME%

Sitten päästään itse asiaan. ECHO-rivit muistuttavat vain kuinka pitkäksi aikaa toiminto käynnistetään ja kuinka usein kuvia otetaan. Näytölle otetaan myös aika koska striimaus aloitettiin. Näiden ECHO-rivien muuttaminen ei muuta toimintaa vaan muutokset on tehtävä tuolle riville, missä käynnistetään VLC:tä parametreilla. Huomaa, että komento on yksi rivi, vaikka se saattaa tässä olla jakaantuneena usealle riville.

Katsotaan komennon sisältöä vielä tarkemmin:
”C:\Program Files\VideoLAN\VLC\vlc.exe” 64 bittisen VLC:n oletusasennussijainti. Muuta polku tarvittaessa vastaamaan omaasi.
rtsp://tunnus:salasana@192.168.50.186:554/stream1 Tämä on osoite josta kameran RTSP-stream löytyy. Aika monessa kamerassa tuo
alkuosa on muotoa käyttäjätunnus:salasana@ip-osoite tai url:porttinumero ja loppuosa vaihtelee. Helpointa on laittaa Googleen
hakusanoiksi oman kameran tyyppi ja RTSP. Luotettavinta toiminta on, jos tietokone ja kamera ovat samassa sisäverkossa. Onnistuu toki eri
verkoissakin, mutta sitten joutuu vähän virittelemään jo palomuuriakin.
–video-filter=scene Käytetään VLC:n scene-nimistä videofiltteriä. Scene on tarkoitettu tallentamaan videosta yksittäisiä kuvia
–scene-prefix=img Tämä kertoo scenelle, että talletetun kuvan nimi tulee alkaa ”img”. Loppuosa on automaattinen numerointi. Numero on
aina sen framen numero joka on talletettu. Jos otetaan kuvia 6 sekunnin välein, ensimmäinen kuva on numero 00001, toinen on 00121, kolmas
00241 jne.

–scene-format=jpg kertoo scenelle halutun kuvaformaatin, esim. jpg.
–scene-path=”D:\Timelapse\TimeLapse%now%” tässä määritellään minne kuvat talletetaan. Kyseessä on siis sama kansio joka luotiin
muutama rivi aiemmin.

–scene-ratio 120 Tämä kertoo kuinka usein kuvia kaapataan. Kamerassani videoformaatti on 20 ruutua sekunnissa. Jos haluan kuvia 6
sekunnin välein, laskutoimitus 6×20 kertoo että arvoksi on laitettava 120
–run-time 28800 Tässä määritellään kuinka kauan haluat että VLC ajaa striimiä ja kaappaa kuvia. Arvo on sekunteja. Esimerkissä ajetaan
kahdeksan tuntia (60*60*8)

vlc://quit Tämä lopettaa VLC:n kun edellä määritetty aika on kulunut loppuun.
VLC lopettaa toimintansa myös jos videostriimi katkeaa esim tietoliikennekatkoksen vuoksi. Kannattaa myös tarkistaa, että kamerassa ei ole
automaattisia ajatettuja uudelleenkäynnistyksiä.

Kun VLC on valmis, meillä pitäisi olla nyt olemassa kansio jossa on valtava määrä kuvia. Jos hommaa tekisi Linux-puolella, riittäisi että
FFMPEGille kerrotaan mistä kansiosta se ottaa kaikki *.jpg tiedostot timelapse-videoon. Jostain syystä Windows-puolella vastaava komento
puuttuu ja FFMPEGille täytyy tiedostot olla nimetty siten, että numerointi on jatkuva.
:: Set the path to the target directory
SET targetDir=”D:\Timelapse\TimeLapse%now%”
:: Set the starting number
SET /A counter=1
:: List all .jpg files in the target directory sorted by date and pass them to the loop
FOR /F “tokens=*” %%F IN (‘DIR /B /O:D %targetDir%\*.jpg’) DO (
:: Format the counter to five digits with leading zeros
SET formatted_num=00000!counter!
SET formatted_num=!formatted_num:~-5!
:: Rename the file
REN “%targetDir%\%%F” “img!formatted_num!.jpg”
:: Increment the counter
SET /A counter+=1
)

Ensimmäisessä koodiversiossa minulla oli pelkkä uudelleennimeäminen, mutta työkalu tuntui varsin satunnaisessa järjestyksessä nimeävän tiedostoja. Sen takia koodia piti muokata vielä yllä olevan mukaiseksi, joka huolehtii siitä, että tiedostot tulevat kuvaushetken mukaiseen järjestykseen. Tässä oli suureksi avuksi ChatGPT, jonka työtä yllä oleva koodinpätkä on.

Seuraavaksi tehdään timelapse-video:
ECHO Running FFMPEG
:: 3 sec delay to give enough time to read what is above
choice /T 3 /C YN /N /M “.” /D Y
:: change paths for your own
“D:\Timelapse\ffmpeg\bin\ffmpeg.exe” -framerate 30 -i “D:\Timelapse\TimeLapse%now%\img%%05d.jpg” -s:v 1910×1080 -c:v libx264 –
crf 22 -preset slower -pix_fmt yuv420p “D:\Timelapse\Timelapse_%now%.mp4”
ECHO.
ECHO Video was completed at %TIME%
ENDLOCAL
Tässä choice komentoa käytetään ainoastaan siihen, että tehdään 3 sekunnin viive. Tälle ei oikeastaan ole tarvetta, mutta testikäytössä on kätevää kun ehtii lukea ylemmät tekstit ennen kuin FFMPEGin toiminnot täyttävät ruudun. Komento, jolla FFMPEG käynnistetään, on yhdellä rivillä, vaikka se tässä olisikin jakautunut kahdelle riville.

Käydään seuraavaksi läpi FFMPEGin käynnistävä komento vähän tarkemmin
“D:\Timelapse\ffmpeg\bin\ffmpeg.exe” Muuta tämä sen mukaan mistä sinulla ffmpeg.exe löytyy
-framerate 30 Videon haluttu kuvanopeus. Tässä 30 kuvaa sekunnissa. Tarkoittaa sitä, että jos kuvia kaapataan 6 sekunnin välein, yksi
sekunti videota on 180 sekuntia eli kolme minuuttia todellisuutta.
-i “D:\Timelapse\TimeLapse%now%\img%%05d.jpg” Tässä “i” tarkoittaa input. Parametri kertoo FFMPEGille mistä lähdemateriaali löytyy.
Kansion polku on sama kuin ylempänä kuvakaappauksia tehdessä. Tiedostonimessä img%05d.jpg tarkoittaa, että FFMPEG odottaa
kuvasarjaa, jossa tiedostojen nimet ovat muodossa img00001.jpg, img00002.jpg, jne. %05d on muotoilukoodi, jossa %d tarkoittaa numeroa ja
05 määrittelee, että numero on viisinumeroinen, nollilla täydennetty tarvittaessa.
-s:v 1910×1080 Kertoo että lopputuloksena halutaan video, joka on kokoa 1910×1080. Miksi esimerkissäni vaakaresoluutio on 1910, eikä
FullHD:n normaali 1920? Alkuperäisen videon ja siitä kaapattujen ruutujen resoluutio on 2688×1520. Jos haluan videon pystyresoluutioksi
1080, samalla kuvasuhteella lähin kokonaisluku vaakaresoluutiolle on 1910

-c:v libx264 Tämä tarkoittaa, että videoenkooderina käytetään H.264-enkooderia
-crf 22 Tämä on CRF (Constant Rate Factor) -asetus, joka hallitsee videon laatua ja tiedostokokoa. Arvo voi olla välillä 0-51, missä pienempi arvo tarkoittaa parempaa laatua ja suurempaa tiedostokokoa, ja suurempi arvo tarkoittaa huonompaa laatua ja pienempää tiedostokokoa.

Yleensä näkee että käytetään arvoa 17, mutta olen saanut ihan kohtuullista laatua vielä tuolla 22 arvollakin. Huom! Skaala ei ole lineaarinen, vaan arvon nostaminen kuudella karkeasti puolittaa tiedostokoon.

-preset slower Tämä määrittää enkooderin nopeuden ja optimoinnin. Vaihtoehdot ovat välillä ultrafast ja veryslow. Mitä hitaampi preset, sitä enemmän aikaa enkooderi käyttää optimaalisen pakkauksen löytämiseen, mikä yleensä parantaa laatua tai pienentää tiedostokokoa, mutta vie enemmän aikaa. slower on yksi hitaammista vaihtoehdoista, mikä tarkoittaa, että se tuottaa paremman laadun tai pienemmän tiedostokoon kuin nopeammat asetukset, mutta vie enemmän aikaa.

Koska timelapse-video ei ole lopulta kuin muutaman minuutin, ei tuolla slower-
arvollakaan kovin kauaa mene videon tekemiseen, vaikka oma koneeni on jo yli kymmenen vuotta vanha. Lisätietoja CRF-arvon ja presetin
valinnasta löytyy tuolta https://trac.ffmpeg.org/wiki/Encode/H.264

-pix_fmt yuv420p Tämä määrittää pikseliformaatin käytettäväksi videossa. yuv420p on yleisesti käytetty pikseliformaatti, joka takaa yhteensopivuuden useimpien soitinten ja laitteiden kanssa.

“D:\Timelapse\Timelapse_%now%.mp4” Paikka ja nimi lopputuloksena tulevalle videolle. Käytin tässäkin tuota aiemmin määriteltyä %now%
parametria, jotta tiedostolle saadaan automaattisesti uniikki nimi.
Jos kaikki on mennyt kuin piti, ohjelma ilmoittaa kellonajan jolloin video tuli valmiiksi. ENDLOCAL palauttaa skriptin ajossa muokatut muuttajat
oletusarvoihin. Sitten vaan lopputulosta ihailemaan! Minun taivaskamerani revontuli-videoita löytyy malliksi tuolta:
https://www.youtube.com/playlist?list=PLGdlrID3iOtZiO4-hTZX5MxKmtVOGZT-L

Mitä seuraavaksi?

Jatkokehitysaiheena tälle ohjelmapätkälle voisi olla kuvankäsittely kuville ennen niiden yhdistämistä videolle. Minulla oli testissä ratkaisu, jossa
käytettiin GIMP-ohjelmaa ja Python-koodilla tehtyä koodipätkää joka hyödynsi GIMPin erästä pluginia kohinanpoistoon. Sain koodin kyllä
toimimaan, mutta en sellaista lopputulosta jossa kohinan mukana ei olisi poistettu tähtiäkin.
Nyt ei muuta kuin koodailemaan ja taivaskameroita virittelemään. Toivon projekteillesi onnea ja menestystä!

Leave a Reply

Your email address will not be published. Required fields are marked *