Hi,
I realize when i configure the frame range of a job, by exemple “1-10i2”, the value transfer to draft is someting like “1,10,4,6”… So when draft is trying to create the quicktime he’s crashing cause the value transfer isn’t “1-10”.
Do you know how to fix this?
here my script:
[code]import sys
import os
import datetime
import copy
import xml.etree.ElementTree as xml
import Draft
from DraftParamParser import *
print “Draft Version: %s” % Draft.LibraryInfo.Version()
def ResizeWithLetterbox(self, width, height):
if width <= 0:
raise RuntimeError(‘width must be a positive number’)
if height <= 0:
raise RuntimeError(‘height must be a positive number’)
sourceAR = float(self.width) / self.height
destAR = float(width) / height
if sourceAR == destAR:
self.Resize(width, height)
else:
image = copy.deepcopy(self)
if width <= self.width and height <= self.height:
self.Crop(0, 0, width, height)
else:
self.Resize(width,height)
self.SetToColor(Draft.ColorRGBA(0, 0, 0, 1.0))
if sourceAR > destAR:
image.Resize(width,int(round(width/sourceAR)))
else:
image.Resize(int(round(height*sourceAR)),height)
self.CompositeWithPositionAndGravity(image, 0.5, 0.5, Draft.PositionalGravity.CenterGravity, Draft.CompositeOperator.CopyCompositeOp)
Draft.Image.ResizeWithLetterbox = ResizeWithLetterbox
#Returns a list of frames based on the given frameString
def FrameListToFrames( frameString ):
frames = []
frameRangeTokens = re.split( ‘\s+|,+’, frameString )
for token in frameRangeTokens:
try:
if ( len(token) > 0 ):
dashIndex = string.find( token, '-', 1)
if ( dashIndex == -1 ):
startFrame = int(token)
frames.append( startFrame )
else:
startFrame = int(token[0:dashIndex])
m = re.match( "(-?\d+)(?:(x|step|by|every)(\d+))?", token[dashIndex + 1:] )
if ( m == None ):
raise StandardError( "Second part of Token '" + token[dashIndex + 1:] + "' failed regex match" )
else:
endFrame = int(m.group(1))
if ( m.group(2) == None ):
frames.extend( range(startFrame, endFrame + 1 ))
else:
dir = 1
if startFrame > endFrame:
dir = -1
byFrame = int(m.group(3));
frame = startFrame
while (startFrame * dir) <= (endFrame * dir):
frames.add( frame )
frame += byFrame * dir
except:
print "ERROR: Frame Range token '" + token + "' is malformed. Skipping this token."
raise
frames = list(set(frames))
frames.sort()
return frames
#CHANGE ME! Path to the Deadline Repository root
deadlineRepo = “\fx-deadline\deadline\”
#CHANGE ME! Path to an image containing the background of the slate frame
slateFrame = “\\fx-deadline\deadline\Draft\Slate_Montage5K_new.png”
logoFrame = “\\fx-deadline\deadline\Draft\FrimaFX.png”
#The argument name/types we’re expecting from the command line arguments
expectedTypes = dict()
expectedTypes[‘frameList’] = ‘’
expectedTypes[‘inFile’] = ‘’
expectedTypes[‘outFile’] = ‘’
expectedTypes[‘username’] = ‘’
expectedTypes[‘entity’] = ‘’
expectedTypes[‘version’] = ‘’
#expectedTypes[‘deadlineJobID’] = ‘’
#Parse the command line arguments
params = ParseCommandLine( expectedTypes, sys.argv )
inFilePattern = params[‘inFile’]
frames = FrameListToFrames( params[‘frameList’] )
if(True):
(outDir, outFile) = os.path.split(params[‘outFile’])
(outBase, outExt) = os.path.splitext(outFile)
outFolder = os.path.basename(outDir)
if not os.path.exists(os.path.join(outDir, '1080p')):
os.makedirs(os.path.join(outDir, '1080p'))
if not os.path.exists(os.path.join(outDir, 'halfrez')):
os.makedirs(os.path.join(outDir, 'halfrez'))
if not os.path.exists(os.path.join(outDir, 'fullrez')):
os.makedirs(os.path.join(outDir, 'fullrez'))
else:
(outBase, outExt) = os.path.splitext(params[‘outFile’])
outWidth = 1920
outHeight = 1080
halfWidth = 2560
halfHeight = 1350
slateFrames = 1
outLut = Draft.LUT.CreateRec709()
for eye in [‘l’,‘r’]:
#Build up the encoders
outBaseEye = outBase.replace( ‘%v’, eye )
outBaseEyeHalf = outBase.replace( ‘%v’, eye ) + “-Hres”
outBaseEyeFull = outBase.replace( ‘%v’, eye ) + “-Fres”
#Appends (#) on the end of the filename until we have a unique name
increment = 2
newFileName = '%s/1080p/%s%s'%(outDir, outBaseEye, outExt)
while os.path.exists( newFileName ):
newFileName = '%s/1080p/%s (%d)%s'%(outDir, outBaseEye, increment, outExt)
increment += 1
#Appends (#) on the end of the filename until we have a unique name
increment = 2
newFileNameHalf = '%s/halfrez/%s%s'%(outDir, outBaseEyeHalf, outExt)
while os.path.exists( newFileNameHalf ):
newFileNameHalf = '%s/halfrez/%s (%d)%s'%(outDir, outBaseEyeHalf, increment, outExt)
increment += 1
MJPEGencoder = Draft.VideoEncoder( newFileName, 24.0, outWidth, outHeight, 75000, "MJPEG" )
MJPEGencoderHRes = Draft.VideoEncoder( newFileNameHalf, 24.0, halfWidth, halfHeight, 325000, "MJPEG" )
#Annotation info used for burn ins
annotationInfo = Draft.AnnotationInfo()
annotationInfo.FontType = "Arial"
annotationInfo.PointSize = int( outHeight * 0.017 )
annotationInfo.Color = Draft.ColorRGBA( 1.0, 1.0, 1.0, 1.0 )
#Annotation info used for burn ins
annotationInfoBig = Draft.AnnotationInfo()
annotationInfoBig.FontType = "Arial"
annotationInfoBig.PointSize = int( outHeight * 0.02 )
annotationInfoBig.Color = Draft.ColorRGBA( 1.0, 1.0, 1.0, 1.0 )
#Annotation info used for burn ins
annotationInfoFrame = Draft.AnnotationInfo()
annotationInfoFrame.FontType = "Arial"
annotationInfoFrame.PointSize = int( outHeight * 0.025 )
annotationInfoFrame.Color = Draft.ColorRGBA( 1.0, 1.0, 1.0, 1.0 )
#prep the Slate Frame
try:
slate = Draft.Image.ReadFromFile( slateFrame )
except:
slate = Draft.Image.CreateImage( outWidth, outHeight )
slate.SetToColor( Draft.ColorRGBA( 0.0, 0.0, 0.0, 1.0 ) )
if ( slate.width != outWidth or slate.height != outHeight ):
slate.ResizeWithLetterbox( outWidth, outHeight )
#sets up the text on the slate frame
slateAnnotations = [params['entity'], params['version'], params['username'], datetime.datetime.now().strftime("%m/%d/%Y %I:%M %p"), params['frameList']]
for i in range (0, 4):
annotation = Draft.Image.CreateAnnotation(slateAnnotations[i], annotationInfo)
slate.CompositeWithPositionAndGravity(annotation, 0.23, 0.446 - (i * 0.03), Draft.PositionalGravity.NorthWestGravity, Draft.CompositeOperator.OverCompositeOp)
annotation = Draft.Image.CreateAnnotation(slateAnnotations[4], annotationInfo)
slate.CompositeWithPositionAndGravity(annotation, 0.327, 0.24, Draft.PositionalGravity.SouthGravity, Draft.CompositeOperator.OverCompositeOp)
oFrameRangeSplit = slateAnnotations[4].split('-')
oFrameCount = str(int(oFrameRangeSplit[1]) - int(oFrameRangeSplit[0]) + 1)
annotation = Draft.Image.CreateAnnotation(oFrameCount, annotationInfoBig)
slate.CompositeWithPositionAndGravity(annotation, 0.251, 0.237, Draft.PositionalGravity.SouthGravity, Draft.CompositeOperator.OverCompositeOp)
#encode the slate frames at the start of the video
print( "Encoding Slate Frames..." )
for i in range( 0, slateFrames ):
MJPEGencoder.EncodeNextFrame( slate )
MJPEGencoderHRes.EncodeNextFrame( slate )
studioAnnotation = Draft.Image.CreateAnnotation( "The Ice Age", annotationInfo )
entityAnnotation = Draft.Image.CreateAnnotation( "%s %s" % (params['entity'], datetime.datetime.now().strftime("%m/%d/%Y")), annotationInfo )
dateAnnotation = Draft.Image.CreateAnnotation( datetime.datetime.now().strftime("%m/%d/%Y"), annotationInfo )
shotAnnotation = Draft.Image.CreateAnnotation(params['entity'], annotationInfo)
try:
logo = Draft.Image.ReadFromFile( logoFrame )
logo.Resize(int(0.1852*outHeight), int(0.0657*outHeight))
except:
logo = Draft.Image.CreateImage( outWidth, outHeight )
logo.SetToColor( Draft.ColorRGBA( 0.0, 0.0, 0.0, 1.0 ) )
#annotationInfo.BackgroundColor = Draft.ColorRGBA( 0.0, 0.0, 0.0, 1.0 )
#initialize the frame to None
bgFrame = None
#Main encoding loop
for frameNumber in frames:
print( "Processing Frame: %d...-1" % frameNumber )
inFile = inFilePattern.replace( '%v', eye )
inFile = ReplaceFilenameHashesWithNumber( inFile, frameNumber )
if os.path.exists( inFile ):
try:
#try to read in the frame
bgFrame = Draft.Image.ReadFromFile( inFile )
except:
#failed to read in, that's OK, we'll just re-encode the previous frame
pass
#create a black frame if we couldn't read in, and don't have a previous frame to encode
if bgFrame == None:
bgFrame = Draft.Image.CreateImage( outWidth, outHeight )
bgFrame.SetToColor( Draft.ColorRGBA( 0.0, 1.0, 0.0, 1.0 ) )
elif ( bgFrame.width != outWidth or bgFrame.height != outHeight ):
bgFrame.ResizeWithLetterbox( outWidth, outHeight )
#Do the frame burnins
framesAnnotation = Draft.Image.CreateAnnotation( str( frameNumber ), annotationInfoFrame )
bgFrame.CompositeWithPositionAndGravity( framesAnnotation, 0.825, 0.062, Draft.PositionalGravity.SouthEastGravity, Draft.CompositeOperator.OverCompositeOp )
#don't redo the other burnins, or the LUT since we've already done it for the last frame
if os.path.exists( inFile ):
bgFrame.CompositeWithPositionAndGravity( studioAnnotation, 0.0, 1.0, Draft.PositionalGravity.NorthWestGravity, Draft.CompositeOperator.OverCompositeOp )
bgFrame.CompositeWithPositionAndGravity( dateAnnotation, 0.0, 0.0, Draft.PositionalGravity.SouthWestGravity, Draft.CompositeOperator.OverCompositeOp )
bgFrame.CompositeWithPositionAndGravity( shotAnnotation, 0.5, 0.0, Draft.PositionalGravity.SouthGravity, Draft.CompositeOperator.OverCompositeOp )
outLut.Apply( bgFrame )
if os.path.exists( inFile ):
bgFrame.CompositeWithPositionAndGravity( logo, 0.95, 0.05, Draft.PositionalGravity.SouthEastGravity, Draft.CompositeOperator.OverCompositeOp )
MJPEGencoder.EncodeNextFrame( bgFrame )
MJPEGencoderHRes.EncodeNextFrame( bgFrame )
#Finalize the encoding process
MJPEGencoder.FinalizeEncoding()
MJPEGencoderHRes.FinalizeEncoding()[/code]
Thanks !
Fred