[Ratkaisu] Web-kamerakuvan lähettäminen www-palvelimella näytettäväksi

Lähtökohta
Olen kytkenyt web-kameran tietokoneeseeni. Kameralle on ajurit, ja se toimii, eli pystyn katsomaan kameran ottamaa kuvaa paikallisesti esimerkiksi xawtv:llä.
Minulla on käyttäjätunnus ja salasana ftp-palvelimelle, ja niitä käyttäen pystyn päivittämään web-sivuiltani maailmalle näkyvää sisältöä. Palvelimella on web-sivu, joka näyttää palvelintilaani tallennetun webcam.jpg -nimisen tiedoston, ja päivittää, eli lataa kuvan automaattisesti uudestaan kerran minuutissa.
Omalla koneellani, kotihakemistossani on bin-alihakemisto ja se on määritelty komentojenhakupolkujen (PATH-muuttuja) joukkoon komentoriviprofiilissani. Olen tallentanut bin-hakemistoon rhythmbox-print-playing -komentojonotiedoston ja todennut sen toimivan.
Pakettienhallinnassa ftp, came, imagemagick ja rhythmbox ovat asennettuna.
Ongelma
Haluan, että tietokoneeni tallentaa web-kamerani näkymän kuvatiedostoon, lisää tiedostoon tallennetun kuvan päälle tekstinä kuvanottohetken ja lisäksi tiedot samalla hetkellä Rytmilaatikko-musiikkisoittimessa soivasta kappaleesta, ja lähettää sen jälkeen kuvasta kopion web-palvelimelle. Haluan, että näin tapahtuu automaattisesti kerran minuutissa sen jälkeen, kun olen antanut käskyn, ja aina siihen saakka, että annan kieltävän käskyn.
Ratkaisu
  1. Luon komennolla kotihakemistooni .camE -alihakemiston. Hakemiston luomiseen käytän mkdir ~/.camE -komentoa. Tähän hakemistoon tallennan jatkossa osan tarvittavista tiedostoista.
  2. Luon camE:lle kuvan ottamiseen liittyvät parametrit määrittelevän asetustiedoston.
    Avaan komennolla gedit ~/.camE/camErc asetustiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:

    [ftp]
    do = 0
    
    [grab]
    archive_shot_every = 0
    logfile = /home/jani/.camE/camElog
    device = /dev/video0
    temp_file = /home/jani/.camE/webcam.png
    blockfile = /home/jani/.camE/BLOCK
    
    # lag reduction, takes 5 shots, discards
    # the first 4, thus clearing mmap buffers
    lag_reduce = 5
    
    width  = 320
    height = 240
  3. Luon kuvan web-palvelimelle lataamista varten ftp-asetustiedoston.
    1. Avaan komennolla gedit ~/.netrc asetustiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
      machine ftp.palvelin.com
      login tunnukseni
      password salasanani
      
      macdef putcampic
      	prompt off
      	lcd /home/jani/.camE
      	cd kuvakansio
      	bin
      	put webcam.jpg
      	quit
    2. Muutan komennolla chmod 600 ~/.netrc asetustiedoston oikeuksia niin, että kukaan muu kuin minä ei voi sitä avata, sillä tiedosto sisältää ftp-palvelimen salasanani salaamattomassa muodossa.
  4. Luon komentojonotiedoston kuvan päälle tulevien tekstien latomiseen.
    1. Avaan komennolla gedit ~/bin/camprint komentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
      #!/bin/sh
      
      # kirjasimen voi säätää tästä.
      FONT="-font Helvetica -pointsize 10"
      
      # ladotaan komentorivillä annetut tekstit.
      # ensimmäinen parametri ladotaan ylälaitaan,
      # toinen alalaitaan.
      convert webcam.png \
      	-gravity north -stroke '#000C' -strokewidth -2 \
      	$FONT -annotate 0 "$1" \
      	-stroke none $FONT -fill white -annotate 0 "$1" \
      	-gravity south -stroke '#000C' -strokewidth -2 \
      	$FONT -annotate 0 "$2" \
      	-stroke none $FONT -fill white -annotate 0 "$2" \
      	-quality 80 webcam.jpg

      Lataa camprint (498 tavun komentojonotiedosto)

    2. Muutan komennolla chmod +x ~/bin/camprint komentojonotiedoston oikeuksia niin, että siitä tulee suoritettava.
  5. Luon komentojonotiedoston, joka kerää toiminnot yhteen. Se ottaa kameralla kuvan, latoo kuvan päälle tekstit ja lataa kuvatiedoston sen jälkeen web-palvelimelle.
    1. Avaan komennolla gedit ~/.camE/camEsh komentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
      #!/bin/sh
      
      cd /home/jani/.camE/
      
      if [ -f BLOCK ]
      then
        exit
      fi
      
      # napataan kuva.
      camE -s -c camErc
      
      # parhaillaan soivan kappaleen esittely.
      NP="`/home/jani/bin/rhythmbox-print-playing`"
      
      # kuvanottohetki.
      DT=$(date -d "`stat -c %y webcam.png | cut -d. -f1`" | \
      	cut -d+ -f1 | sed 's/[ ]*$//')
      
      # ladotaan tekstit.
      /home/jani/bin/camprint "$NP" "$DT"
      
      # jos kuvan luominen on onnistunut,
      # siirretään se palvelimelle.
      if [ -f webcam.jpg ]
      then
        # tämä vaatii toimivan, putcampic-nimisen
        # makron ~/.netrc:ssä.
        echo "\$ putcampic" | ftp mummila.atspace.com
        rm webcam.jpg webcam.png
      fi
    2. Muutan komennolla chmod +x ~/.camE/camEsh komentojonotiedoston oikeuksia niin, että siitä tulee suoritettava.
  6. Luon komentojonotiedostot kamerakuvan lähetyksen käynnistystä ja lopettamista varten.
    1. Avaan komennolla gedit ~/bin/camon käynnistyskomentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
      #!/bin/sh
      
      rm -f /home/jani/.camE/BLOCK
    2. Avaan komennolla gedit ~/bin/camoff lopetuskomentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
      #!/bin/sh
      
      touch /home/jani/.camE/BLOCK
    3. Muutan molempien komentojonotiedostojen oikeuksia komennolla chmod +x ~/bin/camon ; chmod +x ~/bin/camoff niin, että niistä tulee suoritettavia.
    4. Asetan lopuksi komennolla camoff kuvien lähettämisen pois päältä -tilaan.
  7. Luon crontab-tiedostoon rivin, joka suorittaa tehtävät kerran minuutissa aina silloin kun olen niin määrännyt.
    Avaan komennolla crontab -e crontab-tiedostoni muokattavaksi. Lisään tiedostoon seuraavan rivin:

    * * * * * /home/jani/.camE/camEsh

Kaikkien näiden toimenpiteiden jälkeen kuvan ottaminen ja web-palvelimelle päivittäminen tapahtuu kerran minuutissa sen jälkeen, kun olen komentanut camon, ja jatkuu kunnes komennan camoff.

Huomautuksia
  • Tämän ratkaisun lähtökohdissa mainittu webkamerakuvaa näyttävä sivuni löytyy webistä.
  • CamE osaa itsekin latoa tekstiä ottamansa kuvan päälle ja kopioida kuvan palvelimelle ftp:tä käyttäen. Jälkikäsittelymahdollisuuksia on kuitenkin enemmän, kun jälkikäsittelyyn käytetään ImageMagickia. Tässä ratkaisussa käytin melkein kaikkein yksinkertaisinta tekstinladontatapaa, joka ei juurikaan poikkea siitä mihin camE pystyisi. ImageMagickin mahdollistamia erilaisia hienoja ladontatapoja on esitelty Examples of ImageMagick Usage -oppaassa.
  • Komennolla camE -s -c ~/.camE/camErc voi testata CamE:n asetustiedoston, ~/.camE/camErc:n toimivuutta. Komennon ajamisen jälkeen asetustiedostossa olevan temp_file -parametrin määrittelemässä paikassa pitäisi olla web-kameran ottama kuva.
  • Komennolla echo "\$ putcampic" | ftp ftp.palvelin.com voi testata ftp-asetustiedoston, ~/.netrc:n toimivuutta sen jälkeen, kun ~/.camE -hakemistossa on webcam.jpg -niminen tiedosto.

Comments

One response to “[Ratkaisu] Web-kamerakuvan lähettäminen www-palvelimella näytettäväksi”

  1. Vuorovaikuttaja Avatar

    Poistin merkinnästä tämäntyyppisen ongelman yhteydessä tyhjänpäiväisen syy-osion.