From c8cbb765baf4f9cd0738fffa1f6d839d804eb040 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 27 Jan 2018 03:08:28 +0100 Subject: further cleanup and new example --- src/examples/elevate2017.json | 139 ++++++++++++++++++++++++++++++++++++++++++ src/flufigut.py | 39 +++++++----- 2 files changed, 164 insertions(+), 14 deletions(-) create mode 100644 src/examples/elevate2017.json (limited to 'src') diff --git a/src/examples/elevate2017.json b/src/examples/elevate2017.json new file mode 100644 index 0000000..ae53362 --- /dev/null +++ b/src/examples/elevate2017.json @@ -0,0 +1,139 @@ +{ + "globals":{ + "templates": "default", + "version": "0.10.1", + "name": "elevate-live", + "description": "Live from Elevate Festival 2017", + "domain": "spreadspace.org", + "manager": { + "machine": "telesto", + "host": "109.73.158.69", + "port": 7531, + "transport": "ssl" + }, + "admin": { + "username": "equinox", + "password": "whGCy0u8Cio7Ctzik8oq" + }, + "stats": { + "rrd": { + "directory": "/var/lib/flumotion/rrd" + } + }, + "resolutions": { + "720p25": { "width": 1280, "height": 720, "rate": "25/1" }, + "480p25": { "width": 854, "height": 480, "rate": "25/1" }, + "360p25": { "width": 640, "height": 360, "rate": "25/1" }, + "240p25": { "width": 426, "height": 240, "rate": "25/1" } + }, + "formats": { + "flash": { "muxer": "flv", "video": "h264", "audio": "aac", "samplerate": 44100 }, + "webm": { "muxer": "webm", "video": "vp8", "audio": "vorbis" }, + "ogg": { "muxer": "ogg", "video": "theora", "audio": "vorbis" }, + "mp3": { "muxer": "mp3", "video": "null", "audio": "mp3" }, + "rec": { "muxer": "mkv", "video": "mjpeg", "audio": "raw" } + }, + "profiles": { + "high": { "video": "720p25", "audio": 160 }, + "medium": { "video": "480p25", "audio": 128 }, + "low": { "video": "360p25", "audio": 96 }, + "mini": { "video": "240p25", "audio": 64 }, + "full": { "video": "720p25", "audio": 0 } + }, + "bitrates": { + "h264": { "720p25": 1800, "480p25": 1000, "360p25": 600, "240p25": 300 }, + "vp8": { "720p25": 1800, "480p25": 1000, "360p25": 600, "240p25": 300 }, + "mjpeg": { "720p25": 95 } + }, + "workers": { + "telesto": [ "input-sdi-orig", "resize-sdi-orig", "resample-sdi-orig", + "encoder-sdi-orig-vorbis-160", "encoder-sdi-orig-vorbis-128", "encoder-sdi-orig-vorbis-96", "encoder-sdi-orig-vorbis-64", + "encoder-sdi-orig-aac-160", "encoder-sdi-orig-aac-128", "encoder-sdi-orig-aac-96", "encoder-sdi-orig-aac-64", + "encoder-sdi-orig-mp3-160", "encoder-sdi-orig-mp3-128", "encoder-sdi-orig-mp3-96", "encoder-sdi-orig-mp3-64", + "encoder-sdi-orig-h264-720p25", "encoder-sdi-orig-h264-480p25", "encoder-sdi-orig-h264-240p25", + "encoder-sdi-orig-mjpeg-720p25", "muxer-avr-rec-full", "encoder-sdi-orig-raw-0" ], + "calypso": [ "encoder-sdi-orig-vp8-720p25", "encoder-sdi-orig-vp8-480p25", "encoder-sdi-orig-vp8-360p25", "encoder-sdi-orig-vp8-240p25", + "encoder-sdi-orig-h264-360p25", + "muxer-av-orig-webm-high", "muxer-av-orig-webm-medium", "muxer-av-orig-webm-low", "muxer-av-orig-webm-mini", + "muxer-av-orig-flash-high", "muxer-av-orig-flash-medium", "muxer-av-orig-flash-low", "muxer-av-orig-flash-mini", + "muxer-audio-orig-ogg-high", "muxer-audio-orig-ogg-medium", "muxer-audio-orig-ogg-low", "muxer-audio-orig-ogg-mini", + "muxer-audio-orig-mp3-high", "muxer-audio-orig-mp3-medium", "muxer-audio-orig-mp3-low", "muxer-audio-orig-mp3-mini", + "streamer-local1", "recorder-av", "recorder-audio" ], + "elemc00": [ "repeater-pub" ], + "elemc01": [ "streamer-pub1" ], + "elemc02": [ "streamer-pub2" ] + } + }, + "inputs": { + "sdi-orig": { + "type": "decklink", + "master": true, + "properties": { + "resolution": "720p25", + "samplerate": 48000, + "device": 0, + "connection": 0, + "audio-input": 0, + "mode": 10 + } + } + }, + "muxes": { + "av-orig": { + "video": "sdi-orig:video", + "audio": "sdi-orig:audio", + "formats": { + "flash": [ "high", "medium", "low", "mini" ], + "webm": [ "high", "medium", "low", "mini" ] + } + }, + "avr": { + "video": "sdi-orig:video", + "audio": "sdi-orig:audio", + "formats": { + "rec": [ "full" ] + } + }, + "audio-orig": { + "audio": "sdi-orig:audio", + "formats": { + "ogg": [ "high", "medium", "low", "mini" ], + "mp3": [ "high", "medium", "low", "mini" ] + } + } + }, + "streams": { + "streamer-local": { + "muxes": [ "av-orig", "audio-orig" ], + "type": "http", "count": 1, "port": 8000, + "max-con": 100, "burst-on-connect": 5, + "hostname": "elevate-feed", + "localdup" : { "port": 8001, "formats": [ "flash" ], "burst-on-connect": 3 } + }, + "streamer-pub": { + "muxes": [ "av-orig", "audio-orig" ], + "type": "http", "count": 2, "port": 8000, + "max-bw": 290000000, "burst-on-connect": 5, + "hostname": "elevate-live%i", "repeater": "repeater-pub", + "localdup" : { "port": 8001, "formats": [ "flash" ], "burst-on-connect": 3 } + } + }, + "records": { + "av": { + "muxes": { + "avr": { "format": "rec", "profile": "full" } + }, + "directory": "/srv/elevate2017/", + "filename": "av-orig %Y-%m-%d %H-%M-%S" + }, + "audio": { + "muxes": { + "audio-orig": { "format": "ogg", "profile": "high" } + }, + "directory": "/srv/elevate2017/", + "filename": "audio-orig %Y-%m-%d %H-%M-%S" + } + + } + +} diff --git a/src/flufigut.py b/src/flufigut.py index 7901e9a..94166d0 100755 --- a/src/flufigut.py +++ b/src/flufigut.py @@ -103,9 +103,10 @@ class Planet: master_cnt = 0 for source, input in inputs.items(): comp_name = 'input-%s' % source + comp_desc = 'capture raw data from %s' % (source) self.flow['inputs'][comp_name] = { 'type': input['type'], - 'desc': "capture raw data from %s" % (source), + 'desc': comp_desc, 'worker': None, 'master': input['master'], 'properties': {}, @@ -115,9 +116,9 @@ class Planet: self.__set_input_properties(comp_name, input['properties'], globals) if master_cnt == 0: - raise exception("You have not configured any master clock device!") + raise Exception("You have not configured any master clock device!") elif master_cnt > 1: - raise exception("You have configured multiple master clock devices!") + raise Exception("You have configured multiple master clock devices!") # # muxes @@ -131,11 +132,12 @@ class Planet: if target_samplerate == input_samplerate: return - comp_name = 'resample-%s-%s' % (source, target_samplerate) feeder = 'input-%s' % (mux['audio']) + comp_name = 'resample-%s-%s' % (source, target_samplerate) + comp_desc = 'resample audio from % s to % s Hz' % (source, target_samplerate) self.flow['inputs'][comp_name] = { 'type': 'audio-resample', - 'desc': "resample audio from %s to %s Hz" % (source, target_samplerate), + 'desc': comp_desc, 'worker': None, 'feeder': feeder, 'properties': { @@ -150,21 +152,22 @@ class Planet: return if input_resolution == "": - raise exception("format definition needs video but no video input given") + raise Exception("format definition needs video but no video input given") target_resolution = globals['profiles'][profile]['video'] if target_resolution == input_resolution: return if globals['resolutions'][target_resolution]['rate'] != globals['resolutions'][input_resolution]['rate']: - raise exception("ERROR: video rate conversion is not yet supported!!!") + raise Exception("ERROR: video rate conversion is not yet supported!!!") - comp_name = 'resize-%s-%s' % (source, target_resolution) feeder = 'input-%s' % (mux['video']) + comp_name = 'resize-%s-%s' % (source, target_resolution) + comp_desc = 'resize video from %s to %sx%s' % (source, globals['resolutions'][target_resolution]['width'], + globals['resolutions'][target_resolution]['height']), self.flow['inputs'][comp_name] = { 'type': 'video-resize', - 'desc': "resize video from %s to %sx%s" % (source, globals['resolutions'][target_resolution]['width'], - globals['resolutions'][target_resolution]['height']), + 'desc': comp_desc, 'worker': None, 'feeder': feeder, 'properties': { @@ -189,12 +192,17 @@ class Planet: feeder = 'resample-%s-%s' % (source, target_samplerate) comp_name = 'encode-%s-%s-%i-%i' % (source, encoder, bitrate, target_samplerate) + comp_desc = '%s encoder for %i kbit/s @ %i Hz, from %s' % (encoder, bitrate, target_samplerate, source), + if bitrate == 0: + comp_name = 'encode-%s-%s-%i' % (source, encoder, target_samplerate) + comp_desc = '%s encoder @ %i Hz, from %s' % (encoder, target_samplerate, source), + if comp_name in self.flow['encoders_audio']: return comp_name self.flow['encoders_audio'][comp_name] = { 'type': '%s-encode' % encoder, - 'desc': "%s encoder for %i kbit/s @ %i Hz, from %s" % (encoder, bitrate, target_samplerate, source), + 'desc': comp_desc, 'worker': None, 'feeder': feeder, 'properties': { @@ -216,13 +224,15 @@ class Planet: feeder = 'resize-%s-%s' % (source, target_resolution) comp_name = 'encode-%s-%s-%s' % (source, encoder, target_resolution) + comp_desc = '%s encoder for %sx%s, from %s' % (encoder, globals['resolutions'][target_resolution]['width'], + globals['resolutions'][target_resolution]['height'], source), + if comp_name in self.flow['encoders_video']: return comp_name self.flow['encoders_video'][comp_name] = { 'type': '%s-encode' % encoder, - 'desc': "%s encoder for %sx%s, from %s" % (encoder, globals['resolutions'][target_resolution]['width'], - globals['resolutions'][target_resolution]['height'], source), + 'desc': comp_desc, 'worker': None, 'feeder': feeder, 'properties': { @@ -235,9 +245,10 @@ class Planet: muxer = globals['formats'][format]['muxer'] comp_name = 'mux-%s-%s-%s' % (mux_name, format, profile) + comp_desc = '%s muxer for %s, profile %s' % (format, mux_name, profile), self.flow['muxers'][comp_name] = { 'type': '%s-mux' % muxer, - 'desc': "%s muxer for %s, profile %s" % (format, mux_name, profile), + 'desc': comp_desc, 'worker': None, 'feeder_audio': audio_encoder, 'feeder_video': video_encoder, -- cgit v1.2.3