"""'framework'-style module for creating dv files with pygame. see bottom for an example usage """ from __future__ import division from Numeric import * import popen2,sys import pygame import Image,ImageFilter scaling=1 # this scales all length values until the end, when PIL resizes to video pygame.init() class Dvsurf: """sends finished frames to the screen or to encodedv, via a pipe, for writing to a compressed DV file.""" starttime=0 def __init__(self,scaling=1,preview=1,filename=""): """unset preview and pass filename to write to a DV file, or set preview to display onscreen""" self.imagesize=array([640,480])*scaling self.screen = pygame.display.set_mode(self.imagesize) self.scaling=scaling self.image=pygame.Surface(self.imagesize) self.preview=preview self.framenum=0 self.filename=filename if filename: (encodeout,self.encodein, encodeerr) = popen2.popen3("encodedv -v -a wav - /80g/video/reel2003/dummy.wav > %s"%filename) def startframe(self): """call this at the beginning of the frame, so that in preview mode, we wait for the right delay after displaying the frame""" self.starttime=pygame.time.get_ticks() def writeframe(self): if self.preview: self.screen.blit(self.image,(0,0)) pygame.display.update() if not self.filename: pygame.time.wait(self.starttime+33-pygame.time.get_ticks()) if self.filename: pilimage=Image.fromstring("RGB",self.imagesize, pygame.image.tostring(self.image,"RGB")) pilimage=pilimage.resize((720,480),Image.BILINEAR) pilimage=pilimage.filter(ImageFilter.SMOOTH) pilimage.save(self.encodein,"ppm") # pipes into encodedv sys.stderr.write("%s frame %s \r" % (self.filename,self.framenum)) sys.stderr.flush() self.framenum+=1 def __del__(self): # didn't seem to be happening on its own if self.filename: self.encodein.close() if __name__=='__main__': import sys pygamedv=sys.modules['__main__'] # pretend I said "import pygamedv" dvsurf=pygamedv.Dvsurf(scaling=1, # increase for more sampling (larger img) preview=0, # changes mode to the on-screen, 30fps preview filename='out.dv') img=dvsurf.image for framenum in range(100): dvsurf.startframe() img.fill((0,0,0)) # the image is kept as 4:3 (like your screen), and stretched # only when it goes to dv pygame.draw.circle(img,(255,255,0), array(img.get_size())/2, (framenum+5)/105*img.get_height()/2*.9, 1) dvsurf.writeframe()