From: Calin Crisan Date: Sun, 28 Sep 2014 14:37:25 +0000 (+0300) Subject: timelapse: framerate is now given rather than speed X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=dd334bc29941bc8a29c91972d7cf1e82319b3253;p=motioneye-debian timelapse: framerate is now given rather than speed --- diff --git a/src/handlers.py b/src/handlers.py index 6f9d4ad..87b0e0a 100644 --- a/src/handlers.py +++ b/src/handlers.py @@ -889,10 +889,10 @@ class PictureHandler(BaseHandler): else: interval = int(self.get_argument('interval')) - speed = int(self.get_argument('speed')) + framerate = int(self.get_argument('framerate')) - logging.debug('preparing timelapse movie for group %(group)s of camera %(id)s with rate %(speed)s/%(int)s' % { - 'group': group, 'id': camera_id, 'speed': speed, 'int': interval}) + logging.debug('preparing timelapse movie for group %(group)s of camera %(id)s with rate %(framerate)s/%(int)s' % { + 'group': group, 'id': camera_id, 'framerate': framerate, 'int': interval}) camera_config = config.get_camera(camera_id) if utils.local_camera(camera_config): @@ -905,7 +905,7 @@ class PictureHandler(BaseHandler): 'group': group, 'id': camera_id, 'key': key}) self.finish_json({'key': key}) - mediafiles.get_timelapse_movie(camera_config, speed, interval, callback=on_timelapse, group=group) + mediafiles.get_timelapse_movie(camera_config, framerate, interval, callback=on_timelapse, group=group) else: # remote camera def on_response(response=None, error=None): @@ -918,7 +918,7 @@ class PictureHandler(BaseHandler): 'group': group, 'id': camera_id, 'key': key}) self.finish_json({'key': key}) - remote.get_timelapse_movie(camera_config, speed, interval, callback=on_response, group=group) + remote.get_timelapse_movie(camera_config, framerate, interval, callback=on_response, group=group) def try_finish(self, content): try: diff --git a/src/mediafiles.py b/src/mediafiles.py index 1ea4e39..7d798b1 100644 --- a/src/mediafiles.py +++ b/src/mediafiles.py @@ -58,7 +58,7 @@ def _list_media_files(dir, exts, prefix=None): root = os.path.join(dir, prefix) for name in os.listdir(root): - if name == 'lastsnap.jpg': # ignore the lastsnap.jpg file + if name == 'lastsnap.jpg' or name.startswith('.'): # ignore the lastsnap.jpg and hidden files continue full_path = os.path.join(root, name) @@ -81,7 +81,7 @@ def _list_media_files(dir, exts, prefix=None): else: for root, dirs, files in os.walk(dir): # @UnusedVariable # TODO os.walk can be rewritten to return stat info for name in files: - if name == 'lastsnap.jpg': # ignore the lastsnap.jpg file + if name == 'lastsnap.jpg' or name.startswith('.'): # ignore the lastsnap.jpg and hidden files continue full_path = os.path.join(root, name) @@ -405,7 +405,7 @@ def get_zipped_content(camera_config, media_type, callback, group): poll_process() -def get_timelapse_movie(camera_config, speed, interval, callback, group): +def get_timelapse_movie(camera_config, framerate, interval, callback, group): target_dir = camera_config.get('target_dir') # create a subprocess to retrieve media files @@ -485,18 +485,20 @@ def get_timelapse_movie(camera_config, speed, interval, callback, group): def make_movie(pictures): cmd = 'rm -f %(tmp_filename)s;' - cmd += 'cat %(jpegs)s | ffmpeg -framerate %(speed)s/%(interval)s -f image2pipe -vcodec mjpeg -i - -vcodec mpeg4 -b %(bitrate)s -f avi %(tmp_filename)s' + cmd += 'cat %(jpegs)s | ffmpeg -framerate %(framerate)s -f image2pipe -vcodec mjpeg -i - -vcodec mpeg4 -b:v %(bitrate)s -q:v 0 -f avi %(tmp_filename)s' - bitrate = 9999990 + bitrate = 9999999 cmd = cmd % { 'tmp_filename': tmp_filename, 'jpegs': ' '.join((p['path'] for p in pictures)), - 'interval': interval, - 'speed': speed, + 'framerate': framerate, 'bitrate': bitrate } - process[0] = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) + + logging.debug('executing "%s"' % cmd) + + process[0] = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=None, shell=True) started[0] = datetime.datetime.now() poll_movie_process() diff --git a/src/remote.py b/src/remote.py index ad0e804..32abab1 100644 --- a/src/remote.py +++ b/src/remote.py @@ -401,7 +401,7 @@ def get_zipped_content(local_config, media_type, callback, group): http_client.fetch(request, on_prepare) -def get_timelapse_movie(local_config, speed, interval, callback, group): +def get_timelapse_movie(local_config, framerate, interval, callback, group): host = local_config.get('@host', local_config.get('host')) port = local_config.get('@port', local_config.get('port')) username = local_config.get('@username', local_config.get('username')) @@ -409,17 +409,17 @@ def get_timelapse_movie(local_config, speed, interval, callback, group): uri = local_config.get('@uri', local_config.get('uri')) or '' camera_id = local_config.get('@remote_camera_id', local_config.get('remote_camera_id')) - logging.debug('downloading timelapse movie for group %(group)s of remote camera %(id)s with rate %(speed)s/%(int)s on %(url)s' % { + logging.debug('downloading timelapse movie for group %(group)s of remote camera %(id)s with rate %(framerate)s/%(int)s on %(url)s' % { 'group': group, 'id': camera_id, - 'speed': speed, + 'framerate': framerate, 'int': interval, 'url': make_camera_url(local_config)}) - prepare_uri = uri + '/picture/%(id)s/timelapse/%(group)s/?interval=%(int)s&speed=%(speed)s' % { + prepare_uri = uri + '/picture/%(id)s/timelapse/%(group)s/?interval=%(int)s&framerate=%(framerate)s' % { 'id': camera_id, 'int': interval, - 'speed': speed, + 'framerate': framerate, 'group': group} # timeout here is 100 times larger than usual - we expect a big delay @@ -427,12 +427,12 @@ def get_timelapse_movie(local_config, speed, interval, callback, group): def on_prepare(response): if response.error: - logging.error('failed to download timelapse movie for group %(group)s of remote camera %(id)s with rate %(speed)s/%(int)s on %(url)s: %(msg)s' % { + logging.error('failed to download timelapse movie for group %(group)s of remote camera %(id)s with rate %(framerate)s/%(int)s on %(url)s: %(msg)s' % { 'group': group, 'id': camera_id, 'url': make_camera_url(local_config), 'int': interval, - 'speed': speed, + 'framerate': framerate, 'msg': unicode(response.error)}) return callback(error=unicode(response.error)) @@ -456,12 +456,12 @@ def get_timelapse_movie(local_config, speed, interval, callback, group): def on_download(response): if response.error: - logging.error('failed to download timelapse movie for group %(group)s of remote camera %(id)s with rate %(speed)s/%(int)s on %(url)s: %(msg)s' % { + logging.error('failed to download timelapse movie for group %(group)s of remote camera %(id)s with rate %(framerate)s/%(int)s on %(url)s: %(msg)s' % { 'group': group, 'id': camera_id, 'url': make_camera_url(local_config), 'int': interval, - 'speed': speed, + 'framerate': framerate, 'msg': unicode(response.error)}) return callback(error=unicode(response.error)) diff --git a/static/js/main.js b/static/js/main.js index ec05646..4b3fd15 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -1872,24 +1872,27 @@ function runTimelapseDialog(cameraId, groupKey, group) { '?' + '' + '' + - 'Timelapse speed factor' + - '' + - '' + - '' + + 'Movie framerate' + + '' + '?' + '' + ''); var intervalSelect = content.find('#intervalSelect'); - var speedSelect = content.find('#speedSelect'); + var framerateSlider = content.find('#framerateSlider'); + + makeSlider(framerateSlider, 1, 100, 0, [ + {value: 1, label: '1'}, + {value: 20, label: '20'}, + {value: 40, label: '40'}, + {value: 60, label: '60'}, + {value: 80, label: '80'}, + {value: 100, label: '100'} + ], null, 0); + intervalSelect.val(60); + framerateSlider.val(20).each(function () {this.update()}); + runModalDialog({ title: 'Create Timelapse Movie', closeButton: true, @@ -1898,7 +1901,7 @@ function runTimelapseDialog(cameraId, groupKey, group) { onOk: function () { showModalDialog('', null, null, true); ajax('GET', '/picture/' + cameraId + '/timelapse/' + groupKey + '/', - {interval: intervalSelect.val(), speed: speedSelect.val()}, function (data) { + {interval: intervalSelect.val(), framerate: framerateSlider.val()}, function (data) { hideModalDialog(); /* progress */ hideModalDialog(); /* timelapse dialog */