16th of October, 2015
Adding time lapse / videos using one Python script and one bash script.
1 - Install Python on your RPI2 if it is not already installed
2 - sudo apt-get install python-imaging
3 - Python script
talicam.py
4 - Bash script to convert / compress video files.
mjpeg2mp4
5 - copy a font of choice to same said directory.
18th of October, 2015
Moved the script over to the RPi2 running CumulusMX and autostarting it via a Cron job. Works well.
19th of October, 2015
Testing the script on the Homeseer 3 Zee-2 device. You can just link to the time lapse video in Homeseer 3 and create an event for conversion.
The conversion program hits the RPi2 CPU stuff:
Cron:
Command python /video/talicam.py
CPU 0.4 %
Manual running of bash script:
Command avconv -r 30000/1001 -i cam1.mjpeg -q 5 cam1.mp4
CPU 356 %
Might move it to the HS3 Pro big box.
Adding time lapse / videos using one Python script and one bash script.
1 - Install Python on your RPI2 if it is not already installed
2 - sudo apt-get install python-imaging
3 - Python script
talicam.py
Code:
#!/usr/bin/python # Number of seconds between frames: LAPSE_TIME = 30 # Name of truetype font file to use for timestamps (should be a monospace font!) FONT_FILENAME = "UbuntuMono-B.ttf" # Format of timestamp on each frame TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S" # Command to batch convert mjpeg to mp4 files: # for f in *.mjpeg; do echo $f ; avconv -r 30000/1001 -i "$f" "${f%mjpeg}mp4" 2>/dev/null ; done import urllib import sys, time, datetime import StringIO import Image, ImageDraw, ImageFont class Camera: def __init__(self, name, url, filename): self.name = name self.url = url self.filename = filename def CaptureImage(self): camera = urllib.urlopen(self.url) image_buffer = StringIO.StringIO() image_buffer.write(camera.read()) image_buffer.seek(0) image = Image.open(image_buffer) camera.close() return image def TimestampImage(self, image): draw_buffer = ImageDraw.Draw(image) font = ImageFont.truetype(FONT_FILENAME, 16) timestamp = datetime.datetime.now() stamptext = "{0} - {1}".format(timestamp.strftime(TIMESTAMP_FORMAT), self.name) draw_buffer.text((5, 5), stamptext, font=font) def SaveImage(self, image): with open(self.filename, "a+b") as video_file: image.save(video_file, "JPEG") video_file.flush() def Update(self): image = self.CaptureImage() self.TimestampImage(image) self.SaveImage(image) print("Captured image from {0} camera to {1}".format(self.name, self.filename)) if __name__ == "__main__": cameras = [] cameras.append(Camera("porch", "http://username:password@10.17.42.172/SnapshotJPEG?Resolution=640x480&Quality=Clarity", "cam1.mjpeg")) cameras.append(Camera("driveway", "http://username:password@10.17.42.174/SnapshotJPEG?Resolution=640x480&Quality=Clarity", "cam2.mjpeg")) cameras.append(Camera("backyard", "http://username:password@10.17.42.173/SnapshotJPEG?Resolution=640x480&Quality=Clarity", "cam3.mjpeg")) cameras.append(Camera("sideyard", "http://10.17.42.176/image/jpeg.cgi", "cam4.mjpeg")) cameras.append(Camera("stairway", "http://10.17.42.175/image/jpeg.cgi", "cam5.mjpeg")) print("Capturing images from {0} cameras every {1} seconds...".format(len(cameras), LAPSE_TIME)) try: while (True): for camera in cameras: camera.Update() time.sleep(LAPSE_TIME) except KeyboardInterrupt: print("\nExit requested, terminating normally") sys.exit(0)
mjpeg2mp4
Code:
#!/bin/bash echo "Removing old files..." rm -fv *.mp4 echo "Converting files to mp4..." for f in *.mjpeg ; do t=${f%mjpeg}mp4 echo " Converting $f to $t" avconv -r 30000/1001 -i "$f" -q 5 "$t" 2>/dev/null done echo "Done!"
18th of October, 2015
Moved the script over to the RPi2 running CumulusMX and autostarting it via a Cron job. Works well.
19th of October, 2015
Testing the script on the Homeseer 3 Zee-2 device. You can just link to the time lapse video in Homeseer 3 and create an event for conversion.
The conversion program hits the RPi2 CPU stuff:
Cron:
Command python /video/talicam.py
CPU 0.4 %
Manual running of bash script:
Command avconv -r 30000/1001 -i cam1.mjpeg -q 5 cam1.mp4
CPU 356 %
Might move it to the HS3 Pro big box.