From f00a023641cbf5acb4c806fd992f66a62e49f5a2 Mon Sep 17 00:00:00 2001 From: j Date: Tue, 14 Nov 2023 17:48:55 +0100 Subject: [PATCH] render subtitles --- management/commands/generate_clips.py | 6 +++++- render.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/management/commands/generate_clips.py b/management/commands/generate_clips.py index 5e6d8a0..180a79b 100644 --- a/management/commands/generate_clips.py +++ b/management/commands/generate_clips.py @@ -99,9 +99,13 @@ class Command(BaseCommand): if os.path.islink(target): os.unlink(target) os.symlink(src, target) + subs = [] + for sub in vo.annotations.filter(layer="subtitles").exclude(value="").order_by("start"): + subs.append(sub.json(keys=['in', 'out', 'value'])) voice_over[fragment_id][batch] = { "src": target, - "duration": source.duration + "duration": source.duration, + "subs": subs } with open(os.path.join(prefix, 'voice_over.json'), 'w') as fd: json.dump(voice_over, fd, indent=2, ensure_ascii=False) diff --git a/render.py b/render.py index 4c2e96b..bdaaf2c 100644 --- a/render.py +++ b/render.py @@ -95,6 +95,7 @@ def compose(clips, target=150, base=1024, voice_over=None): voice_overs.append(voice_over[vo2]) print("vo:", [x['src'] for x in voice_overs], list(sorted(voice_over))) vo_min = sum([vo['duration'] for vo in voice_overs]) + sub_offset = 0 if vo_min > target: target = vo_min elif vo_min < target: @@ -108,6 +109,8 @@ def compose(clips, target=150, base=1024, voice_over=None): 'duration': offset }) vo_min += offset + sub_offset = offset + subs = [] for vo in voice_overs: voc = vo.copy() a, b = '3', '-6' @@ -124,6 +127,14 @@ def compose(clips, target=150, base=1024, voice_over=None): vo_low = vo.copy() vo_low['filter'] = {'volume': b} scene['audio-rear']['A1'].append(vo_low) + for sub in voc.get("subs", []): + sub = sub.copy() + sub["in"] += sub_offset + sub["out"] += sub_offset + subs.append(sub) + sub_offset += voc["duration"] + if subs: + scene["subtitles"] = subs clip = None while target - length > 0 and clips: @@ -270,6 +281,10 @@ def render(root, scene, prefix=''): files = [] scene_duration = int(get_scene_duration(scene) * 24) for timeline, data in scene.items(): + if timeline == "subtitles": + with open(os.path.join(root, prefix + "front.srt"), "wb") as fd: + fd.write(ox.srt.encode(data)) + continue #print(timeline) project = KDEnliveProject(root)