multi-threaded webcam with SimpleAsyncHTTPServer.py (updated)

Ray Schumacher subscriber100 at rjs.org
Tue Jan 9 02:02:46 EST 2007


Better asyncore.loop use.
Also fixes a late bug in my first post of code: PILFile.seek(0) 
needed since PIL.save does not reset the pointer.


class ImageServer(RequestHandler):
     def __init__(self, conn, addr, server):
         asynchat.async_chat.__init__(self,conn)
         self.client_address = addr
         self.connection = conn
         self.server = server
         self.set_terminator ('\r\n\r\n')
         self.incoming = deque()
         self.outgoing = deque()
         self.rfile = None
         self.wfile = writewrapper(self.outgoing, -self.use_buffer or 
self.blocksize)
         self.found_terminator = self.handle_request_line
         self.request_version = "HTTP/1.1"
         self.code = None

     def send_head(self):
         buff, width, height = cam.dev.getbuffer()
         imPIL = (Image.frombuffer("RGB", (width, height), buff, 
"raw", "BGR", 0, -1) )
         PILFile.seek(0)
         imPIL.save(PILFile, "JPEG")
         self.send_response(200)
         self.send_header("Content-type", "image/jpeg")
         self.send_header("Content-Length: ", str(PILFile.len))
         self.end_headers()

         self.wfile.write(PILFile.getvalue())
         return
...

     parser.add_option('-3', dest='server',
                       help='Run the server for cam images',
                       action='store_const', const=3)
     options, args = parser.parse_args()
     if options.server==3:
         from StringIO import StringIO
         from PIL import Image
         if sys.platform == 'win32':
             import VideoCapture
             try:
                 del(cam)
                 gc.collect()
                 print "deleted old cam instance"
             except: pass
             cam = VideoCapture.Device(devnum=options.devNum, 
showVideoWindow=0)
             print cam
             buff, width, height = cam.dev.getbuffer()
             PILFile = StringIO()
         else:
             pass
             # try 
http://laurent.pointal.org/python/projets/pyvideograb/index.pih
             # or fg
             #import fg
             #cam = fg.Grabber()
             #cam.set_source(options.devNum)
             # or video4linux.video_capture / v4lctl
     else:
         if options.root is None:
             parser.error("Need root path to start server")

         if not os.path.isdir(options.root):
             parser.error("Root path does not exist")

         os.chdir(options.root)
     req_handler = which[options.server]
     s=Server('',options.port,req_handler)
     print req_handler.__name__, "running on port", options.port, 
"with root path", options.root
     while True:
         try: asyncore.loop(timeout=1, count=1)
         except KeyboardInter




More information about the Python-list mailing list