"""
This python script encodes all files that have the extension mkv in the current
working directory.
Sources:
http://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide
"""
import subprocess, os
#-------------------------------------------------------------------------------
# CONFIGURABLE SETTINGS
#-------------------------------------------------------------------------------
# controls the quality of the encode
CRF_VALUE = '25'
# h.264 profile
PROFILE = 'high'
# encoding speed:compression ratio
PRESET = 'slow'
# path to ffmpeg bin
FFMPEG_PATH = '/usr/bin/ffmpeg'
# font dir
FONT_DIR = '/var/www/.fonts'
#-------------------------------------------------------------------------------
# encoding script
#-------------------------------------------------------------------------------
def process():
cwd = os.getcwd()
# get a list of files that have the extension mkv
filelist = filter(lambda f: f.split('.')[-1] == 'mp4', os.listdir(cwd))
filelist = sorted(filelist)
# encode each file
for file in filelist:
encode(file)
def encode(file):
name = ''.join(file.split('.')[:-1])
#subtitles = 'temp.ass'.format(name)
output = '{}.mp4'.format(name)
try:
command = [
FFMPEG_PATH, '-i', file,
'-c:v', 'libx264', '-preset', PRESET, '-profile:v', PROFILE, '-crf', CRF_VALUE,
]
# create a folder called attachments and symlink it to FONT_DIR
# extract attachments
subprocess.call(['mkdir', 'attachments'])
subprocess.call(['rm', '-f', FONT_DIR])
subprocess.call(['ln', '-s', '{}/attachments'.format(os.getcwd()), FONT_DIR])
os.chdir('attachments')
subprocess.call([FFMPEG_PATH, '-dump_attachment:t', '', '-i', '../{}'.format(file)])
os.chdir('..')
# extract ass subtitles and and subtitle into command
# subprocess.call([FFMPEG_PATH, '-i', file, subtitles])
# if os.path.getsize(subtitles) > 0:
# command += ['-vf', 'ass={}'.format(subtitles)]
output = "/home/ubuntu/fin2/" + output
command += ['-c:a', 'copy'] # if audio is using AAC copy it - else encode it
command += ['-threads', '8', output] # add threads and output
subprocess.call(command) # encode the video!
finally:
# always cleanup even if there are errors
subprocess.call(['rm', '-fr', 'attachments'])
subprocess.call(['rm', '-f', FONT_DIR])
# subprocess.call(['rm', '-f', subtitles])
if __name__ == "__main__":
process()
Comments