pandora_render/ffmpeg.py
2017-08-09 13:00:02 +02:00

63 lines
1.4 KiB
Python

#!/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 = 270
aspect = 16/9
width = int(height * aspect)
n = 0
files = []
for clip in edit:
out = render + '/%06d.ts' % n
clip_aspect = clip['resolution'][0] / clip['resolution'][1]
if clip_aspect < aspect:
x = width
y = int(x / clip_aspect)
else:
y = height
x = int(y * clip_aspect)
vf = 'scale=%s:%s' % (x, y)
if x != width:
vf += ',crop=%s:%s' % (width, height) # crop center
elif y != height:
offset = int((y - height) / 2)
vf += ',crop=w=%s:h=%s:x=0:y=%s' % (width, height, offset)
options = [
'-vf', vf,
'-aspect', aspect,
'-c:v', 'libx264',
'-b:v', '8M',
'-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
]
files.append(out)
run(cmd)
n += 1
files = '|'.join(files)
cmd = ['ffmpeg', '-y', '-i', 'concat:' + files, '-c', 'copy', output]
run(cmd)