From b93750619f1ffb70568240662d81fbc177f01793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 3 Jan 2013 22:58:47 +0100 Subject: [PATCH] Added video creation via ffmpeg --- printer_webui/settings.py | 5 +++-- printer_webui/timelapse.py | 30 ++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/printer_webui/settings.py b/printer_webui/settings.py index 6a9fed54..054bd5c0 100644 --- a/printer_webui/settings.py +++ b/printer_webui/settings.py @@ -32,7 +32,8 @@ default_settings = { }, "folder": { "uploads": None, - "timelapse": None + "timelapse": None, + "timelapse_tmp": None } } @@ -113,7 +114,7 @@ class Settings(object): folder = self.get("folder", type) if folder is None: - folder = os.path.join(self.settings_dir, type) + folder = os.path.join(self.settings_dir, type.replace("_", os.path.sep)) if not os.path.isdir(folder): os.makedirs(folder) diff --git a/printer_webui/timelapse.py b/printer_webui/timelapse.py index f28c4da4..ba768c30 100644 --- a/printer_webui/timelapse.py +++ b/printer_webui/timelapse.py @@ -8,6 +8,8 @@ import os import threading import urllib import time +import subprocess +import glob class Timelapse(object): def __init__(self): @@ -15,7 +17,8 @@ class Timelapse(object): self.inTimelapse = False self.gcodeFile = None - self.captureDir = settings().getBaseFolder("timelapse") + self.captureDir = settings().getBaseFolder("timelapse_tmp") + self.movieDir = settings().getBaseFolder("timelapse") self.snapshotUrl = settings().get("webcam", "snapshot") def onPrintjobStarted(self, gcodeFile): @@ -31,11 +34,15 @@ class Timelapse(object): pass def startTimelapse(self, gcodeFile): + self.cleanCaptureDir() + self.imageNumber = 0 self.inTimelapse = True self.gcodeFile = os.path.basename(gcodeFile) def stopTimelapse(self): + self.createMovie() + self.imageNumber = None self.inTimelapse = False @@ -43,7 +50,7 @@ class Timelapse(object): if self.captureDir is None: return - filename = os.path.join(self.captureDir, "tmp_%i.jpg" % (self.imageNumber)) + filename = os.path.join(self.captureDir, "tmp_%05d.jpg" % (self.imageNumber)) self.imageNumber += 1; captureThread = threading.Thread(target=self.captureWorker, kwargs={"filename": filename}) @@ -52,6 +59,25 @@ class Timelapse(object): def captureWorker(self, filename): urllib.urlretrieve(self.snapshotUrl, filename) + def createMovie(self): + ffmpeg = settings().get("webcam", "ffmpeg") + if ffmpeg is None: + return + + input = os.path.join(self.captureDir, "tmp_%05d.jpg") + output = os.path.join(self.movieDir, "%s_%s.mpg" % (os.path.splitext(self.gcodeFile)[0], time.strftime("%Y%m%d%H%M%S"))) + subprocess.call([ + ffmpeg, '-i', input, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', '25', '-y', + '-b:v', '1500k', '-f', 'vob', output + ]) + + def cleanCaptureDir(self): + if not os.path.isdir(self.captureDir): + return + + for filename in glob.glob(os.path.join(self.captureDir, "*.jpg")): + os.remove(filename) + class ZTimelapse(Timelapse): def __init__(self): Timelapse.__init__(self)