Old website — for up-to-date microsite click on zby.cz below

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.

  1. 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
  2. zkompilujeme se statickym linkováním:
    gcc source/kamery.c -lcurl -lgd -lxvidcore -o kamery (případně příkazem make)
    a spustíme ./kamery -help
  3. 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.

Napiš komentář

Pokud máš co říct, napiš svůj názor nebo komentář. Případně se neboj opravit chybu na stránce nebo jakoliv sám přispět.

(c) 2008 Pavel Zbytovský — for updated microsite see www.zby.cz