import os import shutil import subprocess import ox import itemlist.models import item.models from .render_kdenlive import KDEnliveProject, _CACHE from .render import default_prefix as root from .render import load_defaults def render_all(options): if not options["force"] and os.path.exists(os.path.join(root, "render/forest-5.1.mp4")): print("forest-5.1.mp4 exists, skipping") else: render_forest() if not options["force"] and os.path.exists(os.path.join(root, "render/music-5.1.mp4")): print("music-5.1.mp4 exists, skipping") else: render_music() def render_music(): # Stereo Mix, playing on 5.1 front left/right project = KDEnliveProject(root) qs = item.models.Item.objects.filter( data__type__contains='music' ).order_by('sort__title') for clip in qs: src = clip.files.all()[0].data.path project.append_clip('A1', { "src": src, "duration": clip.sort.duration, "filter": { 'volume': '0', }, }) path = os.path.join(root, "music.kdenlive") with open(path, 'w') as fd: fd.write(project.to_xml()) os.chdir(root) cmd = [ "melt", "music.kdenlive", '-quiet', '-consumer', 'avformat:music.wav' ] print(" ".join([str(x) for x in cmd])) subprocess.call(cmd) info = ox.avinfo('music.wav') cmds = [] cmds.append([ "ffmpeg", "-y", "-nostats", "-loglevel", "error", "-f", "lavfi", "-i", "anullsrc=r=48000:cl=mono", "-t", str(info["duration"]), "music_silence.wav" ]) for src, out1, out2 in ( ('music.wav', "music_left.wav", "music_right.wav"), ): cmds.append([ "ffmpeg", "-y", "-nostats", "-loglevel", "error", "-i", src, "-filter_complex", "[0:0]pan=1|c0=c0[left]; [0:0]pan=1|c0=c1[right]", "-map", "[left]", out1, "-map", "[right]", out2, ]) cmds.append([ "ffmpeg", "-y", "-nostats", "-loglevel", "error", "-i", "music_left.wav", "-i", "music_right.wav", "-i", "music_silence.wav", "-i", "music_silence.wav", "-i", "music_silence.wav", "-i", "music_silence.wav", "-filter_complex", "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[a]", "-map", "[a]", "-ar", "48000", "-c:a", "aac", "render/music-5.1-new.mp4" ]) for cmd in cmds: print(" ".join([str(x) for x in cmd])) subprocess.call(cmd) shutil.move("render/music-5.1-new.mp4", "render/music-5.1.mp4") for name in ( "music.kdenlive", "music.wav", "music_left.wav", "music_right.wav", "music_silence.wav", ): if os.path.exists(name): os.unlink(name) def render_forest(): # Stereo Mix, playing on 5.1 rear left/right project = KDEnliveProject(root) qs = item.models.Item.objects.filter( data__type__icontains='Forest' ).order_by('sort__title') for clip in qs: src = clip.files.all()[0].data.path project.append_clip('A1', { "src": src, "duration": clip.sort.duration, "filter": { 'volume': '0', }, }) path = os.path.join(root, "forest.kdenlive") with open(path, 'w') as fd: fd.write(project.to_xml()) os.chdir(root) cmd = [ "melt", "forest.kdenlive", '-quiet', '-consumer', 'avformat:forest.wav' ] print(" ".join([str(x) for x in cmd])) subprocess.call(cmd) info = ox.avinfo('forest.wav') cmds = [] cmds.append([ "ffmpeg", "-y", "-nostats", "-loglevel", "error", "-f", "lavfi", "-i", "anullsrc=r=48000:cl=mono", "-t", str(info["duration"]), "forest_silence.wav" ]) for src, out1, out2 in ( ('forest.wav', "forest_left.wav", "forest_right.wav"), ): cmds.append([ "ffmpeg", "-y", "-nostats", "-loglevel", "error", "-i", src, "-filter_complex", "[0:0]pan=1|c0=c0[left]; [0:0]pan=1|c0=c1[right]", "-map", "[left]", out1, "-map", "[right]", out2, ]) cmds.append([ "ffmpeg", "-y", "-nostats", "-loglevel", "error", "-i", "forest_silence.wav", "-i", "forest_silence.wav", "-i", "forest_silence.wav", "-i", "forest_silence.wav", "-i", "forest_left.wav", "-i", "forest_right.wav", "-filter_complex", "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[a]", "-map", "[a]", "-ar", "48000", "-c:a", "aac", "render/forest-5.1-new.mp4" ]) for cmd in cmds: print(" ".join([str(x) for x in cmd])) subprocess.call(cmd) shutil.move("render/forest-5.1-new.mp4", "render/forest-5.1.mp4") for name in ( "forest.kdenlive", "forest.wav", "forest_left.wav", "forest_right.wav", "forest_silence.wav", ): if os.path.exists(name): os.unlink(name)