After my initial playing with a webcam and weather related time lapse I got a second hand wireless webcam (a Linksys WVC54GC) to play with. As a package it's really easy to set up and connect to the camera and stream video either using their supplied app or Windows Media player. But no use for getting snapshots as user controlled intervals and putting timestamp overlays on them etc.

That left me with a couple of choices:

  • Buy an application to do it (but frankly after looking at some of the options I decided they didn't offer much value - when the software costs more than the camera I expect more from them!)
  • Build my own.

Now, a few years ago when I was developing code on a daily basis that would possibly have been the easiest.... whip up something to connect to the stream, grab a frame, overlay the timestamp and FTP it to the destination.

Today I'm lazier, and anyway the bits I need to do this are all available for free - I just need to tie them together with the command line and they set up a scheduled task to make them run.

Grabbing the stream

The first challenge was connecting to the stream and grabbing a jpg snapshot that I could work with.

Using MPlayer grabbing the frame didn't turn out to be too much of a challenge. It allows you to attach to a streaming video and pull a number of frame to save as a JPEG

mplayer.exe http://{userid}:{password}@{camera_ip}/img/video.asf -frames 1 -vo jpeg:quality=100:maxfiles=1

Every time this runs it connects to the WiFi Camera video stream and grabs a single, high quality, jpg image (by default saved as 00000001.jpg each time - thanks to the maxfiles parameter)

I used this version of MPlayer built for Windows as it installs and updates easily.

Annotating the image

The next challenge was adding the timestamp to the image to give it some context. This actually gave me two challenges - adding the timestamp and formatting the date correctly from a command line script.

The first was solved with the RunNow.vbs script which allows you to define a number of environment variables for a command line script. I needed to add my own additional environment variable so don't forget to add this to the script

objEnv("MN") = MonthName(Month(dNow))

Next of course was the challenge of actually updating the image itself. For that I turned to ImageMagick a tool I've used before to add text and effects to images. This gives you a number of options for adding a caption to an image.

convert -background "#00000080" -fill white label:"%DOWN% %MN% %Day%, %Year% @ %Hour%:%Minute%:%Second%" miff:- | composite -gravity south -geometry +0+3 - 00000001.jpg image.jpg

This rather scary line takes the source image 00000001.jpg (created from Mplayer) and adds a label using the parameters to position where I want it. The variables %DOWN% etc are all supplied by running this via the RunNow script.

Uploading the image

When the image was composited I wanted to upload it to the Weather Underground site.

Windows comes with a built in command line FTP client, but the Weather Underground server wanted a passive connection which the supplied client doesn't support so I used the free version of MoveIt from Ipswitch - a secure FTP command line client that is a 'drop in' replacement for the existing client.

All I needed to do was create a parameter file to control the FTP script (I saved the script as wificam.ftp)

type binary
put image.jpg image.jpg

and call that from the command line

ftps -s:wificam.ftp

Automating execution

Now I had the pieces it was simple enough to create a Scheduled Task that runs every 10 minutes and executes

RunNow.vbs wificam.cmd

the wificam.cmd script contains the call to Mplayer to grab the frame, the call to ImageMagick to add the caption and the call to MoveIt to use FTP to upload the new image.

The results

Every ten minutes the webcam should upload a new image to Weather Underground here, and they create a stop motion view (last 24 hours below).


A quick note on the WVC54GC: While it's an okay camera for the job I can't recommend it. The Linksys software is pretty horrible and the specs on the camera are at the lower end of the spectrum - small image size/resolution and really bad low light performance. I know they have better cameras now so look to spend a few extra bucks.