From aac613e920fa7ddcd572e0b3223feed3eae76262 Mon Sep 17 00:00:00 2001 From: derchris Date: Tue, 23 Jul 2019 20:40:56 +0200 Subject: [PATCH] add ffmpeg only render for cccamp19 --- cccamp19/Marvel-Bold.ttf | Bin 0 -> 35716 bytes cccamp19/Marvel-Regular.ttf | Bin 0 -> 36964 bytes cccamp19/OFL.txt | 94 +++++++++++++ cccamp19/config.ini | 31 +++++ make-ffmpeg.py | 264 ++++++++++++++++++++++++++++++++++++ 5 files changed, 389 insertions(+) create mode 100755 cccamp19/Marvel-Bold.ttf create mode 100755 cccamp19/Marvel-Regular.ttf create mode 100755 cccamp19/OFL.txt create mode 100644 cccamp19/config.ini create mode 100755 make-ffmpeg.py diff --git a/cccamp19/Marvel-Bold.ttf b/cccamp19/Marvel-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..09be764c758094f428ba760a5d33ed2e6a748a41 GIT binary patch literal 35716 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 KfG1}%@B;voiF;@O literal 0 HcmV?d00001 diff --git a/cccamp19/Marvel-Regular.ttf b/cccamp19/Marvel-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..aa646b8240daaa8c1c90065c96c4fee18b7ff524 GIT binary patch literal 36964 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 literal 0 HcmV?d00001 diff --git a/cccamp19/OFL.txt b/cccamp19/OFL.txt new file mode 100755 index 0000000..9a5b2b7 --- /dev/null +++ b/cccamp19/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2011, Carolina Trebol , +with Reserved Font Name "Marvel". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/cccamp19/config.ini b/cccamp19/config.ini new file mode 100644 index 0000000..838379d --- /dev/null +++ b/cccamp19/config.ini @@ -0,0 +1,31 @@ +[default] +template = cccamp19_talks_intro_1080p.mov + +[title] +in = 193 +out = 324 +font = Marvel-Bold.ttf +fontsize = 120 +fontcolor = #c68100 +x = (w-text_w)/2 +y = 480 + +[speaker] +in = 233 +out = 324 +font = Marvel-Regular.ttf +fontsize = 70 +fontcolor = #c68100 +x = (w-text_w)/2 +y = 845 + +[text] +in = 242 +out = 324 +font = Marvel-Regular.ttf +fontsize = 45 +fontcolor = #c68100 +x = (w-text_w)/2 +y = 927 +text = 'chaos communication camp 2019' + diff --git a/make-ffmpeg.py b/make-ffmpeg.py new file mode 100755 index 0000000..0b13287 --- /dev/null +++ b/make-ffmpeg.py @@ -0,0 +1,264 @@ +#!/usr/bin/env python3 +# vim: tabstop=4 shiftwidth=4 expandtab + +import os +import sys +import subprocess +import renderlib +import argparse +import shlex +from PIL import ImageFont +from configparser import ConfigParser + +# Parse arguments +parser = argparse.ArgumentParser( + description='C3VOC Intro-Outro-Generator - Variant which renders only using video filters in ffmpeg', + usage="./make-ffmpeg.py yourproject/ https://url/to/schedule.xml", + formatter_class=argparse.RawTextHelpFormatter) + +parser.add_argument('project', action="store", metavar='Project folder', type=str, help=''' + Path to your project folder + ''') + +parser.add_argument('schedule', action="store", metavar='Schedule-URL', type=str, nargs='?', help=''' + URL or Path to your schedule.xml + ''') + +parser.add_argument('--debug', action="store_true", default=False, help=''' + Run script in debug mode and render with placeholder texts, + not parsing or accessing a schedule. Schedule-URL can be left blank when + used with --debug + This argument must not be used together with --id + Usage: ./make-ffmpeg.py yourproject/ --debug + ''') + +parser.add_argument('--id', dest='ids', nargs='+', action="store", type=int, help=''' + Only render the given ID(s) from your projects schedule. + This argument must not be used together with --debug + Usage: ./make-adobe-after-effects.py yourproject/ --id 4711 0815 4223 1337 + ''') + +parser.add_argument('--room', dest='rooms', nargs='+', action="store", type=str, help=''' + Only render the given room(s) from your projects schedule. + This argument must not be used together with --debug + Usage: ./make-adobe-after-effects.py yourproject/ --room "HfG_Studio" "ZKM_Vortragssaal" + ''') + +parser.add_argument('--skip', nargs='+', action="store", type=str, help=''' + Skip ID(s) not needed to be rendered. + Usage: ./make-ffmpeg.py yourproject/ --skip 4711 0815 4223 1337 + ''') + +parser.add_argument('--force', action="store_true", default=False, help=''' + Force render if file exists. + ''') + +args = parser.parse_args() + +if (args.skip is None): + args.skip = [] + + +def headline(str): + print("##################################################") + print(str) + print("##################################################") + print() + + +def error(str): + headline(str) + parser.print_help() + sys.exit(1) + + +if not (os.path.exists(os.path.join(args.project, 'config.ini'))): + error("config.ini file in Project Path is missing") + +if not args.project: + error("The Project Path is a required argument") + +if not args.debug and not args.schedule: + error("Either specify --debug or supply a schedule") + +if args.debug: + persons = ['Thomas Roth', 'Dmitry Nedospasov', 'Josh Datko'] + events = [{ + 'id': 'debug', + 'title': 'wallet.fail', + 'subtitle': 'Hacking the most popular cryptocurrency hardware wallets', + 'persons': persons, + 'personnames': ', '.join(persons), + 'room': 'Borg', + }] + +else: + events = list(renderlib.events(args.schedule)) + +parser = ConfigParser() +parser.read(os.path.join(os.path.dirname(args.project), 'config.ini')) +template = parser['default']['template'] + +title_in = parser['title']['in'] +title_out = parser['title']['out'] +title_font = parser['title']['font'] +title_fontsize = parser['title']['fontsize'] +title_fontcolor = parser['title']['fontcolor'] +title_x = parser['title']['x'] +title_y = parser['title']['y'] + +speaker_in = parser['speaker']['in'] +speaker_out = parser['speaker']['out'] +speaker_font = parser['speaker']['font'] +speaker_fontsize = parser['speaker']['fontsize'] +speaker_fontcolor = parser['speaker']['fontcolor'] +speaker_x = parser['speaker']['x'] +speaker_y = parser['speaker']['y'] + +text_in = parser['text']['in'] +text_out = parser['text']['out'] +text_font = parser['text']['font'] +text_fontsize = parser['text']['fontsize'] +text_fontcolor = parser['text']['fontcolor'] +text_x = parser['text']['x'] +text_y = parser['text']['y'] +text_text = parser['text']['text'] + +font_t = os.path.join(os.path.dirname(args.project), title_font) +font_s = os.path.join(os.path.dirname(args.project), speaker_font) +font_tt = os.path.join(os.path.dirname(args.project), text_font) + +fileformat = os.path.splitext(template)[1] +infile = os.path.join(os.path.dirname(args.project), template) + +def describe_event(event): + return "#{}: {}".format(event['id'], event['title']) + + +def event_print(event, message): + print("{} – {}".format(describe_event(event), message)) + + +def fmt_command(command, **kwargs): + args = {} + for key, value in kwargs.items(): + args[key] = shlex.quote(value) + + command = command.format(**args) + return shlex.split(command) + + +def run(command, **kwargs): + return subprocess.check_call( + fmt_command(command, **kwargs), + stderr=subprocess.STDOUT, + stdout=subprocess.DEVNULL) + + +def fit_text(string: str, frame_width): + split_line = [x.strip() for x in string.split()] + lines = "" + w = 0 + line_num = 0 + line = "" + for word in split_line: + w, _ = translation_font.getsize(" ".join([line, word])) + if w > (frame_width - (2 * 6)): + lines += line.strip() + "\n" + line = "" + + line += word + " " + + lines += line.strip() + return lines + + +def fit_title(string: str): + global translation_font + translation_font = ImageFont.truetype( + font_t, size=80, encoding="unic") + title = fit_text(string, 1080) + + return title + + +def fit_speaker(string: str): + global translation_font + translation_font = ImageFont.truetype( + font_s, size=50, encoding="unic") + speaker = fit_text(string, 1080) + + return speaker + + +def enqueue_job(event): + event_id = str(event['id']) + if event_id in args.skip: + event_print(event, "skipping " + str(event['id'])) + return + if (os.path.exists(os.path.join(args.project, event_id + '.ts')) or os.path.exists(os.path.join(args.project, event_id + '.mov'))) and not args.force: + event_print(event, "file exist, skipping " + str(event['id'])) + return + + event_title = str(event['title']) + event_personnames = str(event['personnames']) + + t = fit_title(event_title) + s = fit_speaker(event_personnames) + + if args.debug: + print('Title: ', t) + print('Speaker: ', s) + + if fileformat == '.mov': + outfile = os.path.join(os.path.dirname(args.project), event_id + '.mov') + else: + outfile = os.path.join(os.path.dirname(args.project), event_id + '.ts') + + videofilter = "drawtext=enable='between(n,{0},{1})':fontfile={2}:fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(title_in, title_out, font_t, title_fontsize, title_fontcolor, title_x, title_y, t) + videofilter += "drawtext=enable='between(n,{0},{1})':fontfile={2}:fontsize={3}:fontcolor={4}:x={5}:y={6}:text='{7}',".format(speaker_in, speaker_out, font_s, speaker_fontsize, speaker_fontcolor, speaker_x, speaker_y, s) + videofilter += "drawtext=enable='between(n,{0},{1})':fontfile={2}:fontsize={3}:fontcolor={4}:x={5}:y={6}:text={7}".format(text_in, text_out, font_tt, text_fontsize, text_fontcolor, text_x, text_y, text_text) + + if fileformat == '.mov': + cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -vcodec prores_ks -pix_fmt yuva444p10le -profile:v 4444 -shortest -movflags faststart -f mov "{2}"'.format(infile, videofilter, outfile) + else: + cmd = 'ffmpeg -y -i "{0}" -vf "{1}" -map 0:0 -c:v mpeg2video -q:v 2 -aspect 16:9 -map 0:1 -c:a mp2 -b:a 384k -shortest -f mpegts "{2}"'.format(infile, videofilter, outfile) + if args.debug: + print(cmd) + + run(cmd) + + return event_id + + +if args.ids: + if len(args.ids) == 1: + print("enqueuing {} job".format(len(args.ids))) + else: + print("enqueuing {} jobs".format(len(args.ids))) +else: + if len(events) == 1: + print("enqueuing {} job".format(len(events))) + else: + print("enqueuing {} jobs".format(len(events))) + + +for event in events: + if args.ids and event['id'] not in args.ids: + continue + + if args.rooms and event['room'] not in args.rooms: + print("skipping room %s (%s)" % (event['room'], event['title'])) + continue + + event_print(event, "enqueued as " + str(event['id'])) + + job_id = enqueue_job(event) + if not job_id: + event_print(event, "job was not enqueued successfully, skipping postprocessing") + continue + + +print('all done') + +