#! /usr/bin/env python # Manipulate the time base of CMIF movies # Possibilities: # # - resample at a fixed rate # - divide the time codes by a speed factor (to make it go faster/slower) # - drop frames that are less than n msec apart (to accomodate slow players) # Usage: # # Vtime [-m msec] [-r msec] [-s speed] [infile [outfile]] # Options: # # -m n : drop frames closer than n msec (default 0) # -r n : regenerate input time base n msec apart # -s speed : speed change factor after other processing (default 1.0) # infile : input file (default film.video) # outfile : output file (default out.video) import sys sys.path.append('/ufs/guido/src/video') import VFile import getopt import string # Global options speed = 1.0 mindelta = 0 regen = None # Main program -- mostly command line parsing def main(): global speed, mindelta opts, args = getopt.getopt(sys.argv[1:], 'm:r:s:') for opt, arg in opts: if opt == '-m': mindelta = string.atoi(arg) elif opt == '-r': regen = string.atoi(arg) elif opt == '-s': speed = float(eval(arg)) if len(args) < 1: args.append('film.video') if len(args) < 2: args.append('out.video') if len(args) > 2: sys.stderr.write('usage: Vtime [options] [infile [outfile]]\n') sys.exit(2) sts = process(args[0], args[1]) sys.exit(sts) # Copy one file to another def process(infilename, outfilename): try: vin = VFile.BasicVinFile(infilename) except IOError, msg: sys.stderr.write(infilename + ': I/O error: ' + `msg` + '\n') return 1 except VFile.Error, msg: sys.stderr.write(msg + '\n') return 1 except EOFError: sys.stderr.write(infilename + ': EOF in video file\n') return 1 try: vout = VFile.BasicVoutFile(outfilename) except IOError, msg: sys.stderr.write(outfilename + ': I/O error: ' + `msg` + '\n') return 1 vout.setinfo(vin.getinfo()) vout.writeheader() told = 0 nin = 0 nout = 0 tin = 0 tout = 0 while 1: try: tin, data, cdata = vin.getnextframe() except EOFError: break nin = nin + 1 if regen: tout = nin * regen else: tout = tin tout = int(tout / speed) if tout - told < mindelta: continue told = tout vout.writeframe(tout, data, cdata) nout = nout + 1 vout.close() vin.close() # Don't forget to call the main program main()