From b22258d88e2f929822824033421119a6f61a305f Mon Sep 17 00:00:00 2001 From: Yorick Date: Tue, 8 Dec 2015 17:32:42 +0100 Subject: [PATCH] Very first working prototype --- export-video.py | 223 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 160 insertions(+), 63 deletions(-) diff --git a/export-video.py b/export-video.py index ebeb22c..b448ff7 100755 --- a/export-video.py +++ b/export-video.py @@ -3,75 +3,172 @@ # export-video.py # --------------- # ré-écriture complète du script bash eponyme en python -import sys, getopt, re, os +import sys +import getopt +import re +import os +import subprocess -def usage (): - print ("export-video -i input -o output [-d --desinterlace]") -params = {\ - "desinterlace":False,\ - "file_output":"video",\ - "file_input":"",\ - "video_bitrate":"600k",\ - "audio_bitrate":"96k",\ - "video_quality":"good",\ - "h264_vcommand":"-trellis 0 -me_method umh -subq 8 -me_range 16 -bf 3 -rc_lookahead 16 -g 250",\ - "h264_acommand":"-strict -2'",\ - "webm_vcommand":"rc_lookahead 16 -keyint_min 0 -g 250 -skip_threshold 0 -level 116 -bufsize 500k",\ - "webm_acommand":"-strict -2",\ - "verbose":True,\ - "pattern":""} + +def usage(): + print("export-video -i input -o output [-d --desinterlace]") + +params = { + "desinterlace": False, + "file_output": "video", + "file_input": "", + "vbitrate": "600k", + "abitrate": "96k", + "video_quality": "good", + "h264_vcommand": [ + "-trellis", "0", + "-me_method", "umh", + "-subq", "8", + "-me_range", "16", + "-bf", "3", + "-rc_lookahead", "16", + "-g", "250" + ], + "h264_acommand": ["-strict", "experimental"], + "webm_vcommand": "-rc_lookahead 16 -keyint_min 0 -g 250 -skip_threshold \ + 0 -level 116", + "webm_acommand": "-strict -2", + "verbose": True, + "pattern": "", + "twopass": True} VERSION = "0.1dev" -ffmpeg = "" - -def listFile (directory, pattern): - if params["verbose"]: print ("searching in directory" , directory) - files_list=[] - try: - dirs = os.listdir(directory) - except notDirectory: - print ("error : not a directory?") - return +exec_ffmpeg = os.path.join("ffmpeg") - for i in dirs: - - if os.path.isdir(directory+"/"+i): - files_list.extend(listFile(directory+"/"+i, pattern)) - else: - if re.search(pattern, i) is not None: - files_list.append(directory + "/"+ i) - return files_list +def log(msg): + sys.stdout.write(msg + "\n") - -def processArg (sysarg): - output = "video" - try: - opts, args = getopt.getopt(sysarg, "hi:o:dp:", ["help","input=" "output=", "desinterlace", "pattern="]) - except getopt.GetoptError: - usage() - sys.exit(2) - for opt, arg in opts: - if opt in ("-h, --help"): - usage() - sys.exit() - if opt in ("-o", "--output"): - print ("output spécifié " + arg) - params["file_output"] = arg - if opt in ("-d","--desinterlace"): - print ("desinterlace on") - params["desinterlace"] = True - if opt in ("-i","--input"): - params["file_input"] = arg - if opt in ("-p", "--pattern"): - params["pattern"] = "^\\w*."+arg+"$" + +def listFile(directory, pattern): + if params["verbose"]: + print("searching in directory", directory) + files_list = [] + try: + dirs = os.listdir(directory) + except: + print("error : not a directory?") + return + + for i in dirs: + if os.path.isdir(directory + "/" + i): + files_list.extend(listFile(directory + "/" + i, pattern)) + else: + if re.search(pattern, i) is not None: + files_list.append(directory + "/" + i) + return files_list + + +def processArg(sysarg): + try: + opts, args = getopt.getopt( + sysarg, "hi:o:dp:a:v:2", + [ + "help", + "input=", + "output=", + "desinterlace", + "pattern=", + "abitrate=", + "vbitrate=", + "twopass" + ] + ) + except getopt.GetoptError: + usage() + sys.exit(2) + for opt, arg in opts: + if opt in ("-h, --help"): + usage() + sys.exit() + if opt in ("-o", "--output"): + log("output spécifié " + arg) + params["file_output"] = arg + if opt in ("-d", "--desinterlace"): + log("desinterlace on") + params["desinterlace"] = True + if opt in ("-i", "--input"): + params["file_input"] = arg + if opt in ("-p", "--pattern"): + params["pattern"] = "^\\w*."+arg+"$" + if opt in ("-a", "--abitrate"): + params["abitrate"] = arg + if opt in ("-v", "--vbitrate"): + params["vbitrate"] = arg + if opt in ("-2", "--twopass"): + log("TwoPass encoding on") + params["twopass"] == True + + +def encode_h264(src, dest): + if (params["twopass"] == True): + log("two pass encoding started ...") + firstpass = [ + exec_ffmpeg, + "-y", + "-i", src, + "-codec:va", "libx264", + "-b:v", params["vbitrate"], + "-pass", "1", + ] + params["h264_vcommand"] + [ + "-f", "rawvideo", + "/dev/null" + ] + secondpass = [ + exec_ffmpeg, + "-i", src, + "-pass", "2", + "-codec:v", "libx264", + "-b:v ", params["vbitrate"] + ] + params["h264_vcommand"] + [ + "-b:a", params["abitrate"] + ] + params["h264_acommand"] + [ + dest+".mp4" + ] + subprocess.call(firstpass) + subprocess.call(secondpass) + else: + log("one pass encoding started ...") + encode = [ + exec_ffmpeg, + " -i " + src, + " -pass 2", + "-codec:v libx264", + " -b:v " + params["vbitrate"] + ] + params["h264_vcommand"] + [ + " -b:a "+params["abitrate"], + params["h264_acommand"], + dest+".mp4" + ] + subprocess.call(encode) if __name__ == "__main__": - processArg(sys.argv[1:]) - if not params["file_input"]: - print ("you must specify a file / directory" + params["file_input"]) - sys.exit(2) - if os.path.isdir (params["file_input"]): - if params["verbose"]: print (params["file_input"], " is a directory") - video_files = listFile(params["file_input"], params["pattern"]) + log("export_video v" + VERSION + "FFMPEG exec " + exec_ffmpeg) + processArg(sys.argv[1:]) + if not params["file_input"]: + print("you must specify a file / directory" + params["file_input"]) + sys.exit(2) + if os.path.isdir(params["file_input"]): + if params["verbose"]: + log(params["file_input"]+" is a directory") + video_files = listFile(params["file_input"], params["pattern"]) + else: + if os.path.isfile(params["file_input"]): + if (params["file_output"]): + params["file_output"] = os.path.basename(params["file_input"]) + else: + if(os.path.isdir(params["file_output"])): + params["file_input"] += \ + os.path.basename(params["file_input"]) + log(params["file_input"] + " is a file") + encode_h264(params["file_input"], params["file_output"]) + else: + print("input file desn't exist, bye bye") + sys.exit(2) + sys.exit(0)