Kiek daugiau nei prieš 3 metus, namuose įsirengiau keletą vaizdo stebėjimo kamerų, o stebėjimo kameros, kurios vaizdo medžiagos niekur neišsaugo, nėra labai reikalingos.

Taip pat namuose esu įsirengęs ir nedidelį namų serverį, kuriame saugomos automatinės kopijos, veikia media centras ir, žinoma, naudoju jį stebėjimo kamerų medžiagai saugoti. Deja, prieš keletą dienų sugedo kietasis diskas su operacine sistema. Buvusi diską pakeičiau į SSD ir įdiegiau Ubuntu server 20.04 LTS, o tuo pačiu, nusprendžiau ir dar kartą patikrinti kokios yra vaizdo medžiagos įrašymo galimybės.

Iki šio laiko naudojau „Shinobi“ vaizdo medžiagos gavimui iš kamerų ir išsaugojimui serveryje. „Shinobi“ siūlo ne tik vaizdo įrašymą, bet gali būti naudojamas ir kaip pilnavertis CCTV sprendimas: vaizdo medžiaga išsaugoma ir konvertuojama, galima stebėti kameras tiesiogiai, pranešimų siuntimas, atlikus papildomas konfigūracija, galima turėti judesio aptikimą, o visa tai valdoma per administravimo panelę pasiekiamą per naršyklę.
„Shinobi“ skamba visai neblogai, tačiau asmeniškai man, viso šio funkcionalumo nereikia. Šią programinę įrangą naudojau tik vienam tikslui – vaizdo medžiagos išsaugojimui ir netgi nebuvau visai tuo patenkintas. Tačiau, Shinobi naudoja labai daug RAM ir CPU, tačiau per daug į tai nesigilinau, nes programa savo funkciją atliko.

Taigi, po šio priverstini serverio atnaujinimo, pradėjau galvoti, kaip galėčiau padaryti tai paprasčiau. Ir sprendimas, buvo tikrai ganėtinai paprastas: kadangi mano turimos kameros vaizdą perduoda RTSP (The Real Time Streaming Protocol) protokolu, man tereikia kokios nors programos, kuri tą vaizdą galėtų priimti ir išsaugoti. Šiam tikslui pasirinkau FFmpeg, dėl to, kad tai ko gero didžiausias ir aktyviausiai palaikomas atviro kodo multimedia framework’as.
RTSP srauto gavimas labai paprastas:

ffmpeg -rtsp_transport tcp -i "rtsp://admin:password@192.168.88.10:554/stream" -c copy -map 0 output.mp4

Įvykdžius šią komandą, medžiaga bus išsaugoma į failą „output.mp4“.

Mano sprendimas

Vienas iš mano reikalavimų yra tai, kad vaizdo medžiaga nebūtų saugoma vienam faile, o padalinama į atskirus failus po 10 minučių. Šis padalinimas leidžia išvengti problemų, kai reikia surasti konkretų laiko momentą – tereikia surasti failą su atitinkama laiko žyma ir peržiūrėti turinį. Jeigu tai būtų viename faile, aš net nelabai įsivaizduočiau kaip reikėtų peržiūrėti jį po savaitės :). Taip pat, padalinus atskirais failais, galima lengviau valdyti disko vietą, pavyzdžiui, kai artėjama prie disko užsipildymo, tuomet seniausi failai gali būti pašalinami.

Dabar mano sprendimas atrodo taip:

  • Paleisti FFmpeg komandą, kuri įrašinėtų srautą 10 minučių ir 10 sekundžių į failą su pradžios data ir laiku
  • Pasinaudojant cron, paleisti tą pačią komandą kas 10 minučių.

Atlikus šiuos du veiksmus, kas 10 minučių turėsiu po naują failą su nedideliu persidengimu. Šis persidengimas naudingas, jeigu kamera tampa trumpam nepasiekiama.
Tai nėra idealus variantas, nes jeigu kamera taps nepasiekiama, kitas bandymas įrašyti bus tik po 10 minučių, tad išsaugota medžiaga gali turėti trūkumų. Taip pat, seniausi failai irgi nėra šalinami, tačiau tai tik pradinis variantas, kurį planuoju patobulinti.

Ir pabaigai, mano naudojama komanda ir parametrai paleisti įrašymui:

ffmpeg -loglevel warning -rtsp_transport tcp \
-i "rtsp://admin:password@192.168.88.30:554/Streaming/Channels/101" \
-c copy -map 0 -t 610 \
/mnt/surveillance/kiemas/kiemas-`date +%Y-%m-%d_%H-%M-%S`.mp4