Very first working prototype
This commit is contained in:
parent
5a59ef0367
commit
b22258d88e
1 changed files with 160 additions and 63 deletions
171
export-video.py
171
export-video.py
|
@ -3,51 +3,82 @@
|
||||||
# export-video.py
|
# export-video.py
|
||||||
# ---------------
|
# ---------------
|
||||||
# ré-écriture complète du script bash eponyme en python
|
# 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]")
|
def usage():
|
||||||
params = {\
|
print("export-video -i input -o output [-d --desinterlace]")
|
||||||
"desinterlace":False,\
|
|
||||||
"file_output":"video",\
|
params = {
|
||||||
"file_input":"",\
|
"desinterlace": False,
|
||||||
"video_bitrate":"600k",\
|
"file_output": "video",
|
||||||
"audio_bitrate":"96k",\
|
"file_input": "",
|
||||||
"video_quality":"good",\
|
"vbitrate": "600k",
|
||||||
"h264_vcommand":"-trellis 0 -me_method umh -subq 8 -me_range 16 -bf 3 -rc_lookahead 16 -g 250",\
|
"abitrate": "96k",
|
||||||
"h264_acommand":"-strict -2'",\
|
"video_quality": "good",
|
||||||
"webm_vcommand":"rc_lookahead 16 -keyint_min 0 -g 250 -skip_threshold 0 -level 116 -bufsize 500k",\
|
"h264_vcommand": [
|
||||||
"webm_acommand":"-strict -2",\
|
"-trellis", "0",
|
||||||
"verbose":True,\
|
"-me_method", "umh",
|
||||||
"pattern":""}
|
"-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"
|
VERSION = "0.1dev"
|
||||||
ffmpeg = ""
|
exec_ffmpeg = os.path.join("ffmpeg")
|
||||||
|
|
||||||
def listFile (directory, pattern):
|
|
||||||
if params["verbose"]: print ("searching in directory" , directory)
|
def log(msg):
|
||||||
files_list=[]
|
sys.stdout.write(msg + "\n")
|
||||||
|
|
||||||
|
|
||||||
|
def listFile(directory, pattern):
|
||||||
|
if params["verbose"]:
|
||||||
|
print("searching in directory", directory)
|
||||||
|
files_list = []
|
||||||
try:
|
try:
|
||||||
dirs = os.listdir(directory)
|
dirs = os.listdir(directory)
|
||||||
except notDirectory:
|
except:
|
||||||
print ("error : not a directory?")
|
print("error : not a directory?")
|
||||||
return
|
return
|
||||||
|
|
||||||
for i in dirs:
|
for i in dirs:
|
||||||
|
if os.path.isdir(directory + "/" + i):
|
||||||
if os.path.isdir(directory+"/"+i):
|
files_list.extend(listFile(directory + "/" + i, pattern))
|
||||||
files_list.extend(listFile(directory+"/"+i, pattern))
|
|
||||||
else:
|
else:
|
||||||
if re.search(pattern, i) is not None:
|
if re.search(pattern, i) is not None:
|
||||||
files_list.append(directory + "/"+ i)
|
files_list.append(directory + "/" + i)
|
||||||
|
|
||||||
return files_list
|
return files_list
|
||||||
|
|
||||||
|
|
||||||
def processArg (sysarg):
|
def processArg(sysarg):
|
||||||
output = "video"
|
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sysarg, "hi:o:dp:", ["help","input=" "output=", "desinterlace", "pattern="])
|
opts, args = getopt.getopt(
|
||||||
|
sysarg, "hi:o:dp:a:v:2",
|
||||||
|
[
|
||||||
|
"help",
|
||||||
|
"input=",
|
||||||
|
"output=",
|
||||||
|
"desinterlace",
|
||||||
|
"pattern=",
|
||||||
|
"abitrate=",
|
||||||
|
"vbitrate=",
|
||||||
|
"twopass"
|
||||||
|
]
|
||||||
|
)
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError:
|
||||||
usage()
|
usage()
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
@ -56,22 +87,88 @@ def processArg (sysarg):
|
||||||
usage()
|
usage()
|
||||||
sys.exit()
|
sys.exit()
|
||||||
if opt in ("-o", "--output"):
|
if opt in ("-o", "--output"):
|
||||||
print ("output spécifié " + arg)
|
log("output spécifié " + arg)
|
||||||
params["file_output"] = arg
|
params["file_output"] = arg
|
||||||
if opt in ("-d","--desinterlace"):
|
if opt in ("-d", "--desinterlace"):
|
||||||
print ("desinterlace on")
|
log("desinterlace on")
|
||||||
params["desinterlace"] = True
|
params["desinterlace"] = True
|
||||||
if opt in ("-i","--input"):
|
if opt in ("-i", "--input"):
|
||||||
params["file_input"] = arg
|
params["file_input"] = arg
|
||||||
if opt in ("-p", "--pattern"):
|
if opt in ("-p", "--pattern"):
|
||||||
params["pattern"] = "^\\w*."+arg+"$"
|
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__":
|
if __name__ == "__main__":
|
||||||
|
log("export_video v" + VERSION + "FFMPEG exec " + exec_ffmpeg)
|
||||||
processArg(sys.argv[1:])
|
processArg(sys.argv[1:])
|
||||||
if not params["file_input"]:
|
if not params["file_input"]:
|
||||||
print ("you must specify a file / directory" + params["file_input"])
|
print("you must specify a file / directory" + params["file_input"])
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
if os.path.isdir (params["file_input"]):
|
if os.path.isdir(params["file_input"]):
|
||||||
if params["verbose"]: print (params["file_input"], " is a directory")
|
if params["verbose"]:
|
||||||
|
log(params["file_input"]+" is a directory")
|
||||||
video_files = listFile(params["file_input"], params["pattern"])
|
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)
|
||||||
|
|
Reference in a new issue