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