neděle 14. října 2012

Automatická webkamera

Již dlouho jsem se snažil udělat nějakým způsobem automatické fotítko z v4l2 (video for linux 2), to mi bude samo fotit obrázky na web a budu se na to moct koukat i třeba někde jinde přes internet.

Musím se přiznat, že jsem nečekal něco takového, jakože by to fungovalo asi tak, jak to teď funguje. :)

Celá věc je vlastně založena na svou scriptech, primárním (shotnupload.sh) a zálohovacím (math.sh). Ano, celé to valí v bashi.

shotnupload.sh je vlastně ten jednodušší script, ale ať si nikdo nemyslí, že byl hotov dřív, než ten zálohovací. Právě, že ne.

#!/bin/bash

export DISPLAY=:0; #timto vlastne docilime spusteni okna na nasem displeji, proto musime pouzit cvlc

cvlc -V dummy v4l2:///dev/video0 --v4l2-contrast -2 --v4l2-saturation -2 --video-filter scene --no-audio --scene-path /home/zatnaktel/Obrázky/Webcam/live --scene-prefix image_prefix --scene-format jpg vlc://quit --run-time=1 #prednastavim slozku, format, typ vstupu atp.

cd /home/zatnaktel/Obrázky/Webcam/live/

echo Pripojuji k FTP a odesilam na URL http://zatnaktel.unas.cz/image_prefix00001.jpg ... #to jen pro prehled v prikazovem radku

HOST='zatnaktel.unas.cz'
USER='zatnaktel.unas.cz'
PASSWD='moje_heslo'
FILE='image_prefix00001.jpg'
date > date_prefix00001.inc #cas snimku
FILE2='date_prefix00001.inc'

ftp -n $HOST <<END_SCRIPT #pomoci programu ftp odeslu obrazek na server spolu s casem
quote USER $USER
quote PASS $PASSWD
put $FILE
put $FILE2
quit

END_SCRIPT
echo Uspech!
exit 0


Script se spouští každou minutu, obrázek se ale přepisuje, aby nedošlo k zahlcování serveru skoro duplicitním materiálem. Není to bezpečnostní, takže tak.

math.sh - názvu se divit nebudeme, vpodstatě vznikl při experimentech a pak už jsem to nezměnil. Jde ale o funkci.


#!/bin/bash

cd /home/zatnaktel/Obrázky/Webcam/live/

puvodni_cislo=$(cat ./snaps/math.txt) #math.txt je soubor obashujici cislo

cp ./image_prefix00001.jpg ./snaps/snap-`echo "$puvodni_cislo+1" | bc -q`.jpg #kopirujeme aktualni obrazek na napr. "snap-05.jpg", cislo se zvysuje umerne poctem spusteni scriptu (x+1)

cp ./date_prefix00001.inc ./snaps/`echo "$puvodni_cislo+1" | bc -q`.txt

cislo_nove=$(echo "$puvodni_cislo+1" | bc -q)

echo $cislo_nove > ./snaps/math.txt

echo Pripojuji k FTP a odesilam na URL http://zatnaktel.unas.cz/webcam/snaps/snap-"$cislo_nove".jpg ... #vse posleme na server, jak pocet fotek (kvuli galerii), tak fotku a datum vyfoceni

cd ./snaps/

HOST='zatnaktel.unas.cz'
USER='zatnaktel.unas.cz'
PASSWD='moje_heslo'
FILE='snap-'$cislo_nove'.jpg'
FILE2='math.txt'
FILE3=''$cislo_nove'.txt'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
cd /webcam/snaps/
put $FILE
cd ./date
put $FILE3
cd ../../
put $FILE2
quit

END_SCRIPT
echo Uspech!
exit 0


No není ten bash úžasný? :)

Dále tu máme galerii gallery.php, kterou jsem vlastně použil z webu achatinka, mám dojem, že jsem to tu i posílal s kódem. Tuhle jsem musel trochu upravit, aby byla vůbec kompatibilní se soubory a funkcemi scriptů.


<?php
$id=$_GET["obrazek"];
?>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel='stylesheet' type='text/css' href='./page.css'>
<title>Gallery of snaps</title>
<body id="gal">
<?php
echo $head;
if(file_exists("./snaps/snap-".$id.".jpg")){
$komentar=file_get_contents("./snaps/date/".$id.".txt");
$first_thumb=($id-2);
$second_thumb=($id-1);
$third_thumb=($id);
$fourth_thumb=($id+1);
$fifth_thumb=($id+2);
$posledni=file_get_contents("./math.txt");
echo'
<div id="map"><img src="./snaps/snap-'.$id.'.jpg" id="image" alt="IMAGE"></div>
<div id="komentar">'.$komentar.'</div>
<div id="list">';
if($id!="1"){echo'<a href="gallery.php?obrazek=1" class="gal"><img src="http://achatinka.mysteria.cz/data/nazacatek.png" class="thumb"></a>';}
if(file_exists("./snaps/snap-".$first_thumb.".jpg")){echo"<a href='gallery.php?obrazek=".$first_thumb."'><img src='./snaps/snap-".$first_thumb.".jpg' class='thumb'></a>";}else{echo"<img src='http://achatinka.mysteria.cz/data/upload/thumb.png' class='thumbp'>";}
if(file_exists("./snaps/snap-".$second_thumb.".jpg")){echo"<a href='gallery.php?obrazek=".$second_thumb."'><img src='./snaps/snap-".$second_thumb.".jpg' class='thumb'></a>";}else{echo"<img src='http://achatinka.mysteria.cz/data/upload/thumb.png' class='thumbp'>";}
if(file_exists("./snaps/snap-".$third_thumb.".jpg")){echo"<a href='gallery.php?obrazek=".$third_thumb."'><img src='./snaps/snap-".$third_thumb.".jpg' class='thumb' id='this'></a>";}else{echo"<img src='http://achatinka.mysteria.cz/data/upload/thumb.png' class='thumbp'>";}
if(file_exists("./snaps/snap-".$fourth_thumb.".jpg")){echo"<a href='gallery.php?obrazek=".$fourth_thumb."'><img src='./snaps/snap-".$fourth_thumb.".jpg' class='thumb'></a>";}else{echo"<img src='http://achatinka.mysteria.cz/data/upload/thumb.png' class='thumbp'>";}
if(file_exists("./snaps/snap-".$fifth_thumb.".jpg")){echo"<a href='gallery.php?obrazek=".$fifth_thumb."'><img src='./snaps/snap-".$fifth_thumb.".jpg' class='thumb'></a>";}else{echo"<img src='http://achatinka.mysteria.cz/data/upload/thumb.png' class='thumbp'>";}
if($id!=$posledni){echo'<a href="gallery.php?obrazek='.$posledni.'" class="gal"><img src="http://achatinka.mysteria.cz/data/nakonec.png" class="thumb"></a>';}
echo'</div>';
if(file_exists("./snaps/snap-".$second_thumb.".jpg")){echo'<a href="gallery.php?obrazek='.$second_thumb.'" id="Previous">&lt;</a>';}
if(file_exists("./snaps/snap-".$fourth_thumb.".jpg")){echo'<a href="gallery.php?obrazek='.$fourth_thumb.'" id="Next">&gt;</a>';}
echo'
</body>
</html>
';}
else{
echo'  
<div id="map"><img src="http://achatinka.mysteria.cz/data/warning.png" id="image"></div>
<div id="nazev">ERROR: Image with ID '.$id.' do not exist!</div>
<div id="list"></div>
</body>
</html>  
    ';
    };
?>


K tomu snad není co dodat. Styl je přesně stejný, jako u původní. Chybět by nic nemělo, až na hlavní index.php, jež nás uvádí u kamery.
Kód je hnusný, za to se omlouvám, ale psal jsem ho na rychlo a to vpreparované php je hnuus. Vím to.

<!DOCOTYPE>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Zatnaktel WebCam output</title>
<style>
body
{
padding: 20px;
background: #111;
color: #000;
font-family: Arial;
font-size: 14px;
}
div#page
{
width: 100%;
min-height: 600px;
max-height: 700px;
background-color: #fff;
text-align: center;
padding: 10px 0px;
}
<?php
$mod=date ("H", filemtime("./../image_prefix00001.jpg"));
$mod2=date ("m", filemtime("./../image_prefix00001.jpg"));
$time=date("H",time());
$time2=date("m",time());
if($mod==$time&&$mod2==$time2)
{$bc="background: url('../image_prefix00001.jpg') #fff no-repeat;";}
else {$bc="background: url('./off.png') #fff no-repeat;";$link="<u style=\"font-size:15px;font-weight:bold;cursor:pointer;\" onclick=\"document.getElementById('image').className='image_original';\">Show last image</u>";}
echo'
div.image
{
width: 640px;
height: 480px;
border: 1px solid #000;
margin: 2px auto 10px auto;
position:relative;';
echo $bc;
?>
}

div.image_original
{
width: 640px;
height: 480px;
border: 1px solid #000;
margin: 2px auto 10px auto;
position:relative;
background: url('../image_prefix00001.jpg') #fff no-repeat;
}

span
{
display:block;
width: 100%;
color: #fff;
font-size: 12px;
font-family: Courier;
position: absolute;
bottom: 4px;
left: 5px;
text-align: left;
font-weight: bold;
}

a
{
color: #fff;
decoration: none;
}
</style>

</head>
<body>
<div id="page"><br><h2>Zatnaktel WebCam</h2>
<meta http-equiv="refresh" content="60;url=./">
<b>Image autoupdate every 1 minute.</b><br><br>
<div style="width: 80%;height:0px;border-bottom:1px solid #000;margin: 2px auto;"></div>
<br><a href="gallery.php?obrazek=<?php include'math.txt'; ?>" style="font-weight:bold;color: #000;">Go to gallery</a>
<div id="image" class="image">
<img src="logo.png" alt="Image">
<span>Last taken: <?php include"../date_prefix00001.inc"; ?>, <a href="http://zatnaktel.unas.cz" target="_blank">http://zatnaktel.unas.cz</a>, © Zatnaktel 2012</span>
</div>
<?php echo $link; ?>


</div>

</body>
</html>


Zálohovací script do galerie se spouští každé dvě hodiny a jak už jsem řekl, primární každou minutu.

zatnaktel@Toaster ~ $ crontab -l
# m h  dom mon dow   command
*/1 * * * * /home/zatnaktel/Obrázky/Webcam/live/shotnupload.sh
0 0,2,4,6,8,10,12,14,16,18,20,22 * * * /home/zatnaktel/Obrázky/Webcam/live/math.sh


Tímto bych chtěl taky poděkovat chytrým hlavám na ubuntu fóru, které mi pomohly v momentech, kdy jsem netušil. A že jich bylo. Samozřejmě pak taky kamarádovi z twitteru, který mi hodně poradil u zálohovacího scriptu.

Stránka s aktuální fotkou (index): http://zatnaktel.unas.cz/webcam/
Galerie: http://zatnaktel.unas.cz/webcam/gallery.php?obrazek=1

3 komentáře:

  1. Sice těm kódům ani za mák nerozumím, ale ve finále to vypadá opravdu dobře. ;)

    OdpovědětVymazat
  2. super, nechtel by si to hodit na github? :)

    OdpovědětVymazat
  3. Pěkná práce, Ať žije BASH! Snad jen ten crontab udělat trochu elegantněji ;-)
    0 */2 * * * /home/zatnaktel/Obrázky/Webcam/live/math.sh

    OdpovědětVymazat