#!/usr/bin/python3 import json import os import subprocess import sys def run(cmd): #print(' '.join('"%s"' % c for c in cmd)) subprocess.call(cmd) edit_json = sys.argv[1] edit = json.load(open(edit_json)) render = '/tmp/out' output = '/tmp/test.mp4' height = 480 aspect = 16/9 width = int(height * aspect) width -= width % 2 files = [] for clip in edit: out = render + '/%s_%0.3f-%0.3f.ts' % (clip['oshash'], clip['in'], clip['out']) files.append(out) if os.path.exists(out): continue clip_aspect = clip['resolution'][0] / clip['resolution'][1] if clip_aspect < aspect: x = width y = int(x / clip_aspect) y -= y % 2 else: y = height x = int(y * clip_aspect) x -= x % 2 vf = 'scale=%s:%s' % (x, y) if x != width: vf += ',crop=%s:%s' % (width, height) # crop center elif y != height: offset = int(((y - height) / 3)) vf += ',crop=w=%s:h=%s:x=0:y=%s' % (width, height, offset) options = [ '-vf', vf, '-aspect', str(aspect), '-c:v', 'libx264', '-b:v', '2M', '-preset:v', 'medium', '-profile:v', 'high', '-level:v', '4.0', '-r:v', '25', '-c:a', 'aac', '-ar', '48000', '-ac', '2', '-b:a', '192k', ] cmd = [ 'ffmpeg', '-ss', str(clip['in']), '-i', clip['path'] ] + options + [ '-t', str(clip['out'] - clip['in']), out ] run(cmd) txt = output + '.txt' with open(txt, 'w') as fd: fd.write('file ' + '\nfile '.join(files)) cmd = ['ffmpeg', '-y', '-f', 'concat', '-safe', '0', '-i', txt, '-c', 'copy', output] run(cmd) os.unlink(txt)