Kamery - capture images from ip-webcam to xvid
Program kamery je napsán v jazyce C a umožňuje zaznamenávat video z IP kamery pomocí stahování JPEG obrázku. Celý enkod videa je postaven na testovacím programu xvid_encraw.c
, který využívá všechny možnosti kodeku xvid, argumenty lze využít stejné. Vzhledem k účelu se nahrávání nebalí do žádného containeru, ale soubory obsahují čistý mpeg4 stream, poradí si s ním, třeba VLC player. Výhodou je možnost jakéhokoliv přerušení nahrávání, aniž by byl výsledkem třeba porušený index AVI souboru. Zde je dobrý popis XVIDu.
Intuitivní ovládání vás dovede k xvid-streamu, při nejasnosti lze využít ./kamery -help
.
- Závislosti jsou na třech knihovnách, na debianu/ubuntu naleznete v základních repozitářích. Na mandrivě/madraku možná bude muset vygooglit RPMko.
debian mandriva libxvidcore4-dev libxvid4-devel-1.0.3-1mdk libcurl4-dev libcurl-devel-7.18.0-1mdv2008.1 libgd2-noxmp-dev libgd-devel-2.0.35-3mdv2008.1 - zkompilujeme se statickym linkováním:
gcc source/kamery.c -lcurl -lgd -lxvidcore -o kamery
(případně příkazemmake
)
a spustíme./kamery -help
- Popis důležitých argumentů pro spuštění programu. Všechny argumenty mají zde vyplněný defaultní stav, ten se bere v potaz, když dotyčný argument neuvedete.
-url http://kamera.tgnet.cz/axis-cgi/jpg/image.cgi
jpeg obrázek, který je při každém stáhnutí aktuální -w 352 -h 288
šířka a výška výsledného obrázku (videa), xvid má omezení na dělitelnost čtyřmi -sleep 3
kolik vteřin počkat mezi dvěma snímky -chunktime 3600
za jak dlouho vytvořit nový soubor s videem, 0 = jeden soubor -chunks 1
kolik částí celkem vytvořit, 0 = neomezeně -o output
definuje prefix výstupního souboru: output_YYMMDD_HHMMSS.m4v -authbasic as45vbKj==
jméno:heslo zakódované base64_encodem pro přístup k kamerám zabezpečeným HTTP autorizací, default: nepoužito -maxframes 10
absolutní číslo kolik snímků vytvořit nezávisle na počtu chunks, má své opodstatnění jako horní limit, kdyby se něco pokazilo, default: 0 Spuštěním
./kamery
se vytvoří jeden hodinový záznam z kamery nuselský most.
Poslední verze zdrojáků na stažení, vše je dobře anglicky okomentováno.
Ukázkové 10 minutové video s výchozími parametry (2MB). Celkem 137 snímků, jeden klíčový 26kB a rozdílové průměrně 15kB.
LibGD - grafická knihovna
Knihovna libgd je známá z implementací interpretovaných jazyků, ale velmi potěší jak kvalitně je přístupná v jazyce C a konkrétně jak výbornou má referenční příručku i s přiklady.
save-bitmap.c - ukazuje stažení obrázku, přidání timestamp a následné vytáhnutí BGR bitmapy
Další odkazy: příklad použití GD knihovny, reference libgd, příklad libgd
libjpeg6 a historie mého projektu
V původní verzi projektu jsem úspěšně využíval knihovnu libjpeg6 z roku 1998. Narazil jsem ale v místě kdy jsem chtěl získanou bitmapu resamplovat. Objevil jsem sice jeden vhodný algoritmus, jenže byl závislý na Windows bitmaps. Hledání grafické knihovny skončilo libgdčkem, neboť ho znám z PHP a jeho funkce jsou naprosto vyhovující, později jsem i využil velmi snadné vložení textu (časového razítka) do bitmapy.
test-jpeg6.c - pointer to JPEG is converted to BITMAP
Tento soubor vychází z jpeg-6b/example.c
, lepší přístup ve získávání JPEGu jsem později našel zde.
Časování a timery
Původně jsem chtěl využít systémového timeru typu ITIMER_REAL, ale pak pro účely nahrávání stačilo použít sleep. Zde je příkladné použití toho prvního: test-setitimer.c
Při použití sleepu z ansi knihovny “include <sys/time.h>” zadáme počet vteřin a systém ví, že proces nechce pracovat, proto nechává jiné.
Když nastavíme timer, musíme nastavit busy-sleep třeba while(1); procesor je sice vytížen, ale timer se zavolá přesně na mikrosekundu reálného času a pošle procesu SIGALRM a ten zavolá funkci, která přeruší aktuální činnost procesu. Je vhodný třeba pro vypisování kontrolních informací uživateli každých 10 vteřin.