@@ -47,7 +47,71 @@ def run(self):
4747 for frame in self .capture ():
4848 self .send_frame (frame )
4949
50-
5150class JpegRetriever :
51+ def __init__ (self , streamer ):
52+ self .streamer = streamer
53+
54+ def retrieve (self ):
55+ while True :
56+ ns = os .read (self .pipe , 8 )
57+ n = struct .unpack ('l' , ns )[0 ]
58+ data = os .read (self .pipe , n )
59+ yield data
60+
61+ def __enter__ (self ):
62+ if hasattr (self , 'pipe' ):
63+ raise RuntimeError ()
64+
65+ self .pipe = streamer .register ()
66+ return self .retrieve ()
67+
68+ def __exit__ (self , * args ):
69+ self .streamer .unregister (self .pipe )
70+ del self .pipe
71+ return True
72+
73+ class WebHandler (BaseHTTPRequestHandler ):
74+ retriever = None
75+
76+ @staticmethod
77+ def set_retriever (retriever ):
78+ WebHandler ,retriever = retriever
79+
80+ def do_GET (self ):
81+ if self .retriever is None :
82+ raise RuntimeError ('no retriever' )
83+
84+ if self .path != '/' :
85+ return
86+
87+ self .send_response (200 )
88+ self .send_header ('Content-Type' ,'multipart/x-mixed-replace;boundary=jpeg_frame' )
89+ self .end_headers ()
90+
91+ with self .retriever as frames :
92+ for frame in frames :
93+ self .send_frame (frame )
94+
95+ def send_fame (self , frame ):
96+ sh = b'--jpeg_frame\r \n '
97+ sh += b'Content-Type: image/jpeg\r \n '
98+ sh += b'Content-Length: %d\r \n \r \n ' % len (frame )
99+ self .wfile .write (sh )
100+ self .wfile .write (frame )
101+
102+ if __name__ == "__main__" :
103+ # 创建Streamer, 开启摄像头采集
104+ streamer = JpegStreamer (0 )
105+ streamer .start ()
106+
107+ # http服务创建Retriever
108+ retriever = JpegRetriever (streamer )
109+ WebHandler .set_retriever (retriever )
52110
111+ # 开启http服务器
112+ HOST = 'localhost'
113+ PORT = 9000
114+ print ('Start Server ... (http://%s:%s)' % (HOST , PORT ))
115+ httpd = TCPServer ((HOST , PORT ), WebHandler )
116+ httpd .serve_forever ()
53117
0 commit comments