Compare commits
2 commits
Author | SHA1 | Date | |
---|---|---|---|
seiichiro | 5ed4fb4ae6 | ||
seiichiro | 86eacfa9b5 |
|
@ -4,7 +4,7 @@
|
|||
# n900-encode.py: Encode almost any Video to an Nokia N900-compatible format (h264,aac,mp4)
|
||||
# Disclaimer: This program is provided without any warranty, USE AT YOUR OWN RISK!
|
||||
#
|
||||
# Version 1.1 (22.02.2012)
|
||||
# Version 1.2 (23.03.2012)
|
||||
#
|
||||
# (C) 2010-2012 Stefan Brand <seiichiro@seiichiro0185.org>
|
||||
#
|
||||
|
@ -21,12 +21,12 @@ from time import sleep
|
|||
# Default values, feel free to adjust
|
||||
###########################################################################################
|
||||
|
||||
_basewidth = 800 # Base width for widescreen Video
|
||||
_basewidth = 854 # Base width for widescreen Video
|
||||
_basewidth43 = 640 # Base width for 4:3 Video
|
||||
_maxheight = 480 # maximum height allowed
|
||||
_abitrate = 96 # Audio Bitrate in kBit/s
|
||||
_vbitrate = 500 # Video Bitrate in kBit/s
|
||||
_threads = 2 # Use n Threads to encode
|
||||
_abitrate = 112 # Audio Bitrate in kBit/s
|
||||
_vbitrate = 22 # Video Bitrate in kBit/s, Values < 52 are used as a CRF-Factor
|
||||
_threads = "auto" # Use n Threads to encode
|
||||
_mpbin = None # mplayer binary, if set to None it is searched in your $PATH
|
||||
_ffbin = None # ffmpeg binary, if set to None it is searched in your $PATH
|
||||
|
||||
|
@ -48,15 +48,18 @@ def main(argv):
|
|||
# CLI Argument Processing
|
||||
try:
|
||||
opts, args = getopt.getopt(argv, "i:o:m:v:a:t:hf", ["input=", "output=", "mpopts=", "abitrate=", "vbitrate=", "threads=", "help", "force-overwrite"])
|
||||
except getopt.GetoptError as err:
|
||||
printi(str(err))
|
||||
except:
|
||||
usage()
|
||||
|
||||
if (len(args) != 0):
|
||||
print("Error: Unsupported Arguments found!")
|
||||
usage()
|
||||
|
||||
input = None
|
||||
output = "n900encode.mp4"
|
||||
mpopts = ""
|
||||
abitrate = _abitrate * 1000
|
||||
vbitrate = _vbitrate * 1000
|
||||
vbitrate = int(_vbitrate)
|
||||
threads = _threads
|
||||
overwrite = False
|
||||
for opt, arg in opts:
|
||||
|
@ -69,7 +72,7 @@ def main(argv):
|
|||
elif opt in ("-a", "--abitrate"):
|
||||
abitrate = int(arg) * 1000
|
||||
elif opt in ("-v", "--vbitrate"):
|
||||
vbitrate = int(arg) * 1000
|
||||
vbitrate = int(arg)
|
||||
elif opt in ("-t", "--threads"):
|
||||
threads = arg
|
||||
elif opt in ("-f", "--force-overwrite"):
|
||||
|
@ -80,7 +83,7 @@ def main(argv):
|
|||
# Check for needed Programs
|
||||
global mpbin
|
||||
mpbin = None
|
||||
if not _mpbin == None and os.path.exists(_mpbin) and not os.path.isdir(_mpbin):
|
||||
if not _mpbin == None and os.path.isfile(_mpbin):
|
||||
mpbin = _mpbin
|
||||
else:
|
||||
mpbin = progpath("mplayer")
|
||||
|
@ -90,7 +93,7 @@ def main(argv):
|
|||
|
||||
global ffbin
|
||||
ffbin = None
|
||||
if not _ffbin == None and os.path.exists(_ffbin) and not os.path.isdir(_ffbin):
|
||||
if not _ffbin == None and os.path.isfile(_ffbin):
|
||||
ffbin = _ffbin
|
||||
else:
|
||||
ffbin = progpath("ffmpeg")
|
||||
|
@ -99,7 +102,7 @@ def main(argv):
|
|||
sys.exit(1)
|
||||
|
||||
# Check input and output files
|
||||
if not os.path.isfile(input):
|
||||
if (input == None or not os.path.isfile(input)):
|
||||
print("Error: input file is not a valid File or doesn't exist")
|
||||
sys.exit(2)
|
||||
|
||||
|
@ -121,7 +124,11 @@ def calculate(input):
|
|||
|
||||
# Get characteristics using mplayer
|
||||
cmd=[mpbin, "-ao", "null", "-vo", "null", "-frames", "0", "-identify", input]
|
||||
mp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
|
||||
try:
|
||||
mp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
|
||||
except:
|
||||
print("Error: Couldn't execute mplayer")
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
s = re.compile("^ID_VIDEO_ASPECT=(.*)$", re.M)
|
||||
|
@ -159,13 +166,17 @@ def convert(input, output, res, abitrate, vbitrate, threads, mpopts):
|
|||
pid = os.getpid()
|
||||
afifo = "/tmp/stream" + str(pid) + ".wav"
|
||||
vfifo = "/tmp/stream" + str(pid) + ".yuv"
|
||||
os.mkfifo(afifo)
|
||||
os.mkfifo(vfifo)
|
||||
try:
|
||||
os.mkfifo(afifo)
|
||||
os.mkfifo(vfifo)
|
||||
except:
|
||||
print("Error: Couldn't create fifos!")
|
||||
sys.exit(2)
|
||||
|
||||
# Define mplayer command for video decoding
|
||||
mpvideodec = [ mpbin,
|
||||
"-sws", "9",
|
||||
"-vf", "scale=" + str(res[0]) + ":" + str(res[1]) + ",unsharp=c4x4:0.3:l5x5:0.5",
|
||||
"-vf", "scale=" + str(res[0]) + ":" + str(res[1]) + ",dsize=" + str(res[0]) + ":" + str(res[1]) + ",unsharp=c4x4:0.3:l5x5:0.5", "-ass",
|
||||
"-vo", "yuv4mpeg:file=" + vfifo,
|
||||
"-ao", "null",
|
||||
"-nosound",
|
||||
|
@ -193,6 +204,14 @@ def convert(input, output, res, abitrate, vbitrate, threads, mpopts):
|
|||
|
||||
|
||||
# Define ffmpeg command for a/v encoding
|
||||
|
||||
if (vbitrate > 51):
|
||||
rmode = "-b:v"
|
||||
vbitr = str(vbitrate*1000)
|
||||
else:
|
||||
rmode = "-crf"
|
||||
vbitr = str(vbitrate)
|
||||
|
||||
ffmenc = [ ffbin,
|
||||
"-f", "yuv4mpegpipe",
|
||||
"-i", vfifo,
|
||||
|
@ -206,17 +225,13 @@ def convert(input, output, res, abitrate, vbitrate, threads, mpopts):
|
|||
"-threads", str(threads),
|
||||
"-vprofile", "baseline",
|
||||
"-tune", "animation",
|
||||
"-b:v", str(vbitrate),
|
||||
"-flags", "+loop", "-cmp", "+chroma",
|
||||
rmode, vbitr,
|
||||
"-flags", "+loop", "-cmp", "+chroma", "-coder", "0",
|
||||
"-partitions", "+parti4x4+partp8x8+partb8x8",
|
||||
"-subq", "5", "-trellis", "1", "-refs", "1",
|
||||
"-coder", "0", "-me_range", "16",
|
||||
"-g", "300", "-keyint_min", "25",
|
||||
"-sc_threshold", "40", "-i_qfactor", "0.71",
|
||||
"-bt", "640", "-bufsize", "10M", "-maxrate", "1000000",
|
||||
"-rc_eq", "'blurCplx^(1-qComp)'",
|
||||
"-qcomp", "0.62", "-qmin", "10", "-qmax", "51",
|
||||
"-x264opts", "level=3.0", "-f", "mp4",
|
||||
"-subq", "7", "-trellis", "1", "-refs", "3",
|
||||
"-me_range", "16", "-me_method", "hex",
|
||||
"-bufsize", "10M", "-maxrate", "1000000",
|
||||
"-x264opts", "level=3.1", "-f", "mp4",
|
||||
output ]
|
||||
|
||||
# Start mplayer decoding processes in background
|
||||
|
@ -226,13 +241,22 @@ def convert(input, output, res, abitrate, vbitrate, threads, mpopts):
|
|||
except:
|
||||
print("Error: Starting decoding threads failed!")
|
||||
sys.exit(3)
|
||||
|
||||
|
||||
print("Waiting for decoding threads to start...")
|
||||
|
||||
# Wait
|
||||
sleep(2)
|
||||
# Check if the decoding processes are running
|
||||
if (mda.poll() != None or mdv.poll() != None):
|
||||
print("Error: Starting decoding threads failed!")
|
||||
sys.exit(3)
|
||||
|
||||
# Start ffmpeg encoding process in foreground
|
||||
try:
|
||||
subprocess.check_call(ffmenc)
|
||||
except subprocess.CalledProcessError:
|
||||
print("Error: Encoding thread failed!")
|
||||
sys .exit(4)
|
||||
sys.exit(4)
|
||||
|
||||
|
||||
def progpath(program):
|
||||
|
@ -252,20 +276,21 @@ def cleanup():
|
|||
# Cleanup
|
||||
try:
|
||||
if (mda != None):
|
||||
os.kill(mda.pid())
|
||||
if (mda.returncode == None):
|
||||
mda.kill()
|
||||
if (mdv != None):
|
||||
os.kill(mdv.pid())
|
||||
if (mdv.returncode == None):
|
||||
mdv.kill()
|
||||
finally:
|
||||
if (afifo != None):
|
||||
if (afifo != None and os.path.exists(afifo)):
|
||||
os.remove(afifo)
|
||||
if (vfifo != None):
|
||||
if (vfifo != None and os.path.exists(vfifo)):
|
||||
os.remove(vfifo)
|
||||
os._exit(0)
|
||||
|
||||
def usage():
|
||||
"""Print avaiable commandline arguments"""
|
||||
|
||||
print("This is n900-encode.py (C) 2010 Stefan Brand <seiichiro0185 AT tol DOT ch>")
|
||||
print("This is n900-encode.py (C) 2012 Stefan Brand <seiichiro0185 AT seiichiro0185 DOT org>")
|
||||
print("Usage:")
|
||||
print(" n900-encode.py --input <file> [opts]\n")
|
||||
print("Options:")
|
||||
|
@ -273,7 +298,7 @@ def usage():
|
|||
print(" --output <file> [-o]: Name of the converted Video")
|
||||
print(" --mpopts \"<opts>\" [-m]: Additional options for mplayer (eg -sid 1 or -aid 1) Must be enclosed in \"\"")
|
||||
print(" --abitrate <br> [-a]: Audio Bitrate in KBit/s")
|
||||
print(" --vbitrate <br> [-v]: Video Bitrate in kBit/s")
|
||||
print(" --vbitrate <br> [-v]: Video Bitrate in kBit/s, values less than 52 will be used as CRF-Factor")
|
||||
print(" --threads <num> [-t]: Use <num> Threads to encode")
|
||||
print(" --force-overwrite [-f]: Overwrite output-file if existing")
|
||||
print(" --help [-h]: Print this Help")
|
||||
|
|
Loading…
Reference in a new issue